SpringSecurity
主要功能
认证Authentication、授权Authorization
认证执行流程
0、配置SecurityConfig,放行特定的请求路径,在UsernamePasswordAuthenticationFilter过滤器之前添加自定义过滤器JwtAuthenticationTokenFilter
1、前端发送请求,form表单中必须有username,password
2、经过自定义的JwtAuthenticationTokenFilter过滤器,
从请求头中获取token
token为空 --> 未登录 --> 放行
token不为空 --> 已登录
a.解析token,获取其中的userId
b.根据userId,获取redis中的用户信息
c.将用户信息存储到SecurityContextHolder中
3、执行对应的Service方法,进行逻辑处理后通过Authentication authentication = authenticationManager.authenticate(authenticationToken);调用实现了UserDetailsService的类
4、通过实现UserDetailsService接口,重写loadUserByUsername方法,获取数据库信息与提交用户信息比对,更换密码加密策略,期间出现差错抛出异常,最后封装查询结果信息到UserDetails子类中。
5、由于方法返回值为UserDetails,自定义LoginUser实现UserDetails接口,重写其中的方法,将业务信息和UserDetails原本的信息全部返回。
6、由于SpringSecurity默认的密码加密并不适用,通常我们需要重写。使用BCryptPasswordEncoder进行加密,与数据库比对校验。
7、在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在
SecurityConfig中配置把AuthenticationManager注入容器。认证成功的话要生成一个jwt,放入响应中返回。并且为了让用户下回请求时能通过jwt识别出具体的是哪个用户,我们需要把用户信息存入redis,可以把用户id作为key。
授权执行流程
略
原理分析
核心流程
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请
求。入门案例的认证工作主要有它负责。
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和
AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。
认证流程
Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
AuthenticationManager接口:定义了认证Authentication的方法
UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的
方法。
UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装
成UserDetails对象返回。然后将这些信息封装到Authentication对象中。
授权流程
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在
FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的
权限信息。当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。
然后设置我们的资源所需要的权限即可。