SpringSecurity是Spring框架中的一个安全管理框架.相比于另一个安全框架Shiro提供了更加强大的功能.
核心功能主要包括:
搭建一个简单的Springboot工程
2.在pom文件中引入springboot依赖
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.0version>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
3.创建启动类
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class);
}
}
4.创建conroller
package com.lsy.security.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/securityController")
public class SecurityController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
创建springboot项目成功
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
引入依赖后,尝试刚才测试的url进行访问就会自动跳转到一个springsecurity的默认登录页面,默认用户名为user,密码在控制台输出
这时访问测试的url会自动跳转到这个成功页面
进行登录后,可以正常进行访问其他接口
SpringSecurity还提供了退出功能
SpringSecurity的原理就是一个过滤器链,内部包含了各种功能的过滤器
上图只是展示了核心过滤器,其他的非核心过滤器并没展示
UsernamePasswordAuthenticationFilter:负责处理在登陆界面提交的账号密码的请求.
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器
Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户的相关信息 .
例如下面代码,就是将用户的账号密码封装到Authentication的一个实现类中
//进行用户认证 将用户账号 密码封装到Authentication实现类中
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword());
下图为封装的UsernamePasswordAuthenticationToken类中的信息,用这个类的信息进行认证
AuthenticationManager接口:定义了认证Authentication的方法
例如,下面代码就是将用户信息进行认证
//调用Authenticate方法进行认证
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
如果通过PasswordEncoder对比UserDeTails中的密码和封装的Authentication密码比对正确,就把UserDetails中的权限信息设置到Authentication对象中
注:UserDetails中的密码为通过用户名查询数据库中的密码,Authentication密码为前端返回到后端的密码
下图为密码输入正确返回的authentication对象
UserDetailsService接口:加载了用户特定数据的核心接口.里面定义了一个根据用户名查询用户信息的方法.
UserDetail接口:提供核心用户信息,通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回,然后将这些信息封装到Authentication对象中