SpringSecurity是基于Spring的一个安全管理框架,他提供一般Web项目所需要的认证和授权功能。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户;
授权:经过认证后判断当前用户是否有权限进行某个操作。
引入SpringSecurity:
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-securityartifactId>
- dependency>
实际的前后端分离项目中,我们的整个登录校验流程如下所示,其核心是使用token令牌对客户进行认证。

SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。如下所示:

上图只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。上图中所示的核心过滤器功能如下:
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。
ExceptionTranslationFilter: 处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
FilterSecurityInterceptor: 负责权限校验的过滤器。

概念速查:
Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
AuthenticationManager接口:定义了认证Authentication的方法
UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。
UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。
认证流程:
1、传入用户名和密码
2、UsernamePasswordAuthenticationFilter会把用户名和密码封装成Authentication对象
3、然后又再调用AuthenticationManager接口中的authenticate()方法进行认证,在AuthenticationManager接口的实现类ProviderManager中又调用了重写的authenticate()方法进行认证。抽象类AbstractUserDetailsAuthenticationProvider中重写了authenticate()方法
4、AbstractUserDetailsAuthenticationProvider的authenticate()方法中调用了抽象方法retrieveUser()方法
5、DaoAuthenticationProvider在重写方法retrieveUser()里调用了loadUserByUsername()方法
6、loadUserByUsername()方法会返回UserDetails对象,认证成功逐一返回上一层
登录:

校验:

获取token
解析token获取其中的userid
从redis中获取用户信息