Spring Security 认证流程详解

1、认证流程说明

Spring Security实际上是通过一组过滤器链来对请求进行拦截操作的,如下图所示:

Spring Security过滤器链

       其中UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是两个核心过滤器。而FilterSecurityInterceptor会对之前这些核心过滤器进行相应判断,并抛出异常(例如身份认证没有通过)。然后由ExceptionTranslationFilter捕获抛出来的异常,进行相应处理。

2. 用户登录认证流程

用户登录认证流程

     本系统通过setFilterProcessesUrl("/login/auth")设置该过滤器访问地址,然后客户端登录界面先提交数据到后端进行数据校验(Spring Validation),校验无误后再提交登录信息到本过滤器。 UsernamePasswordAuthenticationFilter接着获取客户的Username和Password将其封装成UsernamePasswordAuthenticationToken对象(Authentication的一个实现类),这个对象中封装了我们需要认证的信息。之后通过调用AuthenticationManager的authenticate方法进行认证。然而实际上认证并不是由AuthenticationManager做的,而是由AuthenticationProvider去实现的,AuthenticationManager的作用是管理一组AuthenticationProvider集合,通过for循环遍历的方式去寻找合适的Provider。这里AuthenticationManager调用DaoAuthenticationProvider去认证。

DaoAuthenticationProvider的类图

     DaoAuthenticationProvider通过调用UserDetailsService的loadUserByUsername方法来获取UserDetails对象。然后比对UserDetails的密码与认证请求的密码是否一致,一致则表示认证通过。在认证成功以后会使用加载的UserDetails(包含用户权限等信息)来封装要返回的Authentication对象,并保存在SecurityContextHolder所持有的SecurityContext中,供后续的程序进行调用,如访问权限的鉴定等。然后此Authentication会沿着调用线返回给UsernamePasswordAuthenticationFilter。 最后就是认证结果的处理部分了。本系统是通过实现UsernamePasswordAuthenticationFilter的successfulAuthentication和unsuccessfulAuthentication方法(也可使用Handler)来对认证结果进行操作。successfulAuthentication方法当认证成功时会调用,这里采用JWT将认证信息封装成Token,存入Redis,并将此Token返回给客户端存入Cookie。而unsuccessfulAuthentication方法是在认证失败时调用,这里将请求forward到Error界面,并对错误结果进行渲染。

3、项目地址

本人的毕设项目——外汇业务管理系统

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章