SpringSecurity的校验与授权
前言:该文章主要是通过学习尚硅谷的课程以及课堂笔记,根据自己的理解总结出来的,旨在加深自己对该部分技术的理解,部分地方可能分析的不对,请谅解。
一、SpringSecurity的两个重要过滤器
SpringSecurity实现认证和授权实际上是通过一系列的过滤器来进行拦截的,其中用到的最重要两个过滤器就是
UsernamePasswordAuthenticationFilter
:负责登录认证
FilterSecurityInterceptor
:负责权限授权
二、SpringSecurity的三个重要组件
1、Authentication
:存储了认证信息,代表当前登录用户
2、SeucirtyContext
:上下文对象,用来获取Authentication
3、SecurityContextHolder
:上下文管理对象,用来在程序任何地方获取SecurityContext
个人理解就类似于下图
Authentication
存储着主要的信息:
1、Principal
:用户信息,没有认证时一般是用户名,认证后一般是用户对象
2、Credentials
:用户凭证,一般是密码
3、Authorities
:用户权限
三、登录校验
在登录校验时,首先将用户名密码传入。封装到UsernamePasswordAuthenticationToken之中,然后使用**AuthenticationManager
** 的authenticate
方法完成认证。该方法的大致逻辑是通过用户名查询出用户,检验用户是否存在以及密码是否正确等操作,如果不符合则抛出异常,通过的话则将用户信息放入UsernamePasswordAuthenticationToken之中,当作Principal,此时的UsernamePasswordAuthenticationToken就相当于是Authentication。
需要配置三个工具:(SpringSecurity都有默认的实现方式,但可能并不满足我们的需求,需要进行改造)
1、密码校验:通常是使用自己特定的加密方式,所以我们要修改密码校验部分的加密方式:implements PasswordEncoder
2、用户信息也需要稍作修改:extends User,这个User是import org.springframework.security.core.userdetails.User
3、然后就是根据用户名获取用户对象的方法,这里需要从我们指定的地方获取用户:implements UserDetailsService
4、重写用户认证接口:extends UsernamePasswordAuthenticationFilter 包括登录认证、登录成功、登录失败的方法
5、重写认证解析token:extends OncePerRequestFilter、这里实现登录接口放行,以及token校验
6、配置用户认证:这里配置不需要验证的接口,即登入接口。并设置认证解析token的过滤器在用户认证的过滤器之前。同时指定加密器以及用户获取的方法,最后设置不拦截的请求,(静态资源、接口文档页面等)
四、用户授权
1、将用户的权限放入到Authentication中,在loadUserByUsername中修改逻辑,查询到权限相关的字符时,将其放入。
2、保存在redis中(登录方法中修改)即修改TokenLoginFilter登录成功方法,用户名为key,权限信息为value
修改TokenAuthenticationFilter验证,从redis中根据用户名获取权限信息
总结:只是简单地了解一下SpringSecurity整合到SpringBoot项目中,更深层次地理解还得在实际工作中多使用,多研究。