Spring Security实现登录

news/2025/2/16 0:02:26/

前言

Spring Security是Spring框架下的一个用于身份验证和授权的框架,它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能,本文主要包括以下内容:

  1. 环境准备
  2. Spring Security核心概念
  3. 实现基本登录功能
  4. 添加Spring Security的数据库认证

环境准备

在开始写Spring Security之前,我们需要配置好以下环境:

  1. JDK 1.8或以上
  2. Maven 3.0或以上
  3. Spring Boot 2.1.4或以上
  4. IDE(推荐使用IntelliJ IDEA)

在完成以上步骤后,我们可以开始编写代码。

Spring Security核心概念

在使用Spring Security时,需要了解一些核心概念:

  1. Authentication: 安全认证对象,包括用户名、密码以及权限等信息。
  2. Authorization: 安全授权对象,授权某个用户拥有访问某个资源的权限。
  3. Filter: 安全过滤器,过滤请求,并传递继续处理请求的权限。
  4. Provider: 安全认证提供者,获取认证信息,并返回持久化信息等内容。

实现基本登录功能

添加依赖

首先需要添加Spring Security的依赖到项目中:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>${spring-boot.version}</version>
</dependency>

开启Spring Security

在Spring Boot启动类上添加@EnableWebSecurity@Configuration注解,并继承WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {//...
}

添加用户信息

我们需要添加两个用户信息,一个是普通用户,一个是管理员用户。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {// 普通用户auth.inMemoryAuthentication().withUser("user").password("123456").roles("USER");// 管理员用户auth.inMemoryAuthentication().withUser("admin").password("123456").roles("USER", "ADMIN");
}

配置授权规则

我们需要在配置类中配置哪些路径需要哪些权限才能访问,以及哪些路径不需要进行安全认证。

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin").hasAnyRole("ADMIN").antMatchers("/user").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin();
}

其中:

  • /admin路径需要ADMIN权限。
  • /user路径需要USER和ADMIN权限。
  • 其他请求需要通过认证后才能访问。
  • 添加**formLogin()**方法开启默认登录界面。

运行程序

现在我们已经完成了一个简单的登录功能,可以运行程序并使用添加的用户进行登录操作。

添加Spring Security的数据库认证

在上面的例子中,我们将用户信息存储在了内存中,但在实际应用中,用户信息往往是存储在数据库中的。

首先我们要创建一张用户表来存储用户信息。

创建用户表

在数据库中创建一个名为 users 的数据表,表的结构如下:

CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(45) NOT NULL,`password` varchar(255) DEFAULT NULL,`enabled` tinyint(1) DEFAULT '1',PRIMARY KEY (`id`)
);

在该表中,字段含义如下:

  • id:自增主键。
  • username:用户用户名。
  • password:用户密码(使用BCrypt加密)。
  • enabled:标记用户是否启用,1为启用,0为禁用。

添加依赖

我们需要添加Spring Security的数据库认证依赖到项目中:

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring-security.version}</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring-security.version}</version>
</dependency>

添加配置

我们需要添加以下配置:

  1. 数据源配置
  2. UserDetailsService配置
  3. PasswordEncoder配置
  4. AuthenticationProvider配置
  5. HttpSecurity配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());}@Beanpublic UserDetailsService userDetailsService() {return new JdbcUserDetailsManager(dataSource);}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Beanpublic AuthenticationProvider authenticationProvider() {DaoAuthenticationProvider provider = new DaoAuthenticationProvider();provider.setUserDetailsService(userDetailsService());provider.setPasswordEncoder(passwordEncoder());return provider;}
}

在代码中,userDetailsService()方法返回一个JdbcUserDetailsManager对象,该对象用于从数据库中加载用户信息。

PasswordEncoder是用于加密密码的,我们使用了BCryptPasswordEncoder来加密密码。

最后,我们还需要配置一个AuthenticationProvider用于处理认证请求。

添加用户信息到数据库

我们需要向数据库中添加一些测试用的用户信息,可以使用以下代码:

@Autowired
private DataSource dataSource;@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).withUser("user").password(passwordEncoder().encode("password")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN");
}

运行程序

现在我们已经完成了数据库认证功能,可以运行程序并使用添加的用户进行登录操作,Spring Security会从数据库中读取用户信息并进行认证。

总结

Spring Security是一个非常好用的身份认证和授权框架,可以有效保证应用的安全性。本文介绍了如何使用Spring Security实现基本的登录功能和数据库认证,希望这篇文章能够帮助到你。


http://www.ppmy.cn/news/78341.html

相关文章

软件测试流程

1、软件测试流程 通常&#xff0c;软件测试流程包括以下几个步骤&#xff1a; 需求分析&#xff1a;确定软件的功能和性能需求&#xff0c;明确测试范围&#xff0c;并编写相应的测试计划。 测试计划&#xff1a;根据需求分析&#xff0c;制定测试计划&#xff0c;包括测试范…

视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN

1. 基本介绍 MS7200 是一款 HDMI 接收芯片&#xff0c;兼容 HDMI1.4b 及 HDMI 1.4b 以下标准的视频 3D 传输格 式&#xff0c;最高分辨率可支持到 4K30Hz&#xff0c;最高采样率达到 300MHz。MS7200 支持 YUV 和 RGB 之 间的色彩空间转换&#xff0c;数字接口支持 YUV 及 RGB 格…

Android NFC研究工具包入门指南

目录 一、NFC简介 二、Android NFC研究工具包 三、NFC的开发环境配置 四、NFC的使用方法 五、Android Beam 六、总结 一、NFC简介 NFC&#xff08;Near Field Communication&#xff09;近场通信&#xff0c;是一种短距离的高频无线通信技术&#xff0c;允许电子设备之间…

物联网手势控制小车所遇问题与解决方案

LCD1602无法显示问题 问题描述&#xff1a;按照开源社区教程完成LCD1602驱动显示程序的编写&#xff0c;成功点亮屏幕&#xff0c;开启背光&#xff0c;但无法观察到显示数据。 分析过程与解决方案&#xff1a; 1.是否IIC地址不对 使用以下代码扫描IIC总线上的设备&#xf…

【lager】日志系统2:测试程序调试

design 官方设计文档 design cmakelist增加plog构建 cmake_minimum_required(VERSION 3.1.3 FATAL_ERROR) project(Lager)set(CMAKE_CXX_STANDARD 11) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)find_package(

shell编程快捷命令

shell编程快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位&#xff0c;对文件的内容进行排序 语法格…

HCIA——VLAN

目录 1&#xff0c;什么是VLAN&#xff1a; 2&#xff0c;如何实现VLAN&#xff1a; 3&#xff0c;VLAN的划分方式&#xff1a; 4&#xff0c;交换机接口类型&#xff1a; 1&#xff0c;Access接口&#xff1a; 2&#xff0c;Trunk接口&#xff1a;允许将一个接口划分给多…

找不到vcruntime140.dll,无法继续执行代码?多种解决方法解析

找不到vcruntime140.dll,无法继续执行代码&#xff1f;当你在尝试运行某个程序时&#xff0c;突然弹出一条错误提示框&#xff0c;告诉你无法继续执行代码&#xff0c;因为找不到vcruntime140.dll。这个问题很常见&#xff0c;但是它可能会让你感到困惑和疑惑。这篇文章将详细介…