SpringSecurity
- 简介
- 一、总体结构
- 二、登录认证
- 1、认证流程
- (1)在config中添加过滤器
- (2)当接收到登录信息之后(对应流程图第一步),会由UsernamePasswordAuthenticationFilter接收,登录成功或者失败都会有相应的方法进行处理
- (3)**attemptAuthentication()**这个方法是进行校验的。用构造一个**UsernamePasswordAuthenticationToken** 作为参数(对应流程图第二步),让**AuthenticationManager.authenticate(upt)** 调用(对应流程图第三步)。
- (4)**AuthenticationManager**通过**ProviderManager**再委托给**DaoAuthenticationProvider** *(它的父类是实现了AuthenticationProvider接口)* ,(这就是对应流程第四步)
- (5)DaoAuthenticationProvider.retrieveUser()调用loadUserByUsername()方法,获取一个UserDetails。(对应流程第五步)
- (6)自定义一个service并实现UserDetailsService接口,同时返回的实体类要继承UserDetails;这里通过用户名在数据库中查找用户的账号密码信息,然后返回一个UserDetails的实体类对象。(对应流程第六步)
- (7)将从数据库中给到的账号密码解密,并与页面提交的信息进行对比(对应流程第七步)。DaoAuthenticationProvider的父类(抽象类)中的authenticate()方法整合两种信息进行比较,认证成功后创建一个Authentication认证信息。
- (8)DaoAuthenticationProvider的父类(抽象类)就一直往上返回。最后返回至UsernamePasswordAuthenticationFilter(对应流程第九步)。
- 2、认证后处理
- 二、授权过程
简介
SpringSecurity的操作都是通过Filter实现,就是Servlet的Filter。
主要是分为两步登录认证和访问授权。
一、总体结构
SecurityContextPersistenceFilter:这个一个贯穿整个流程的Filter,拦截过程的出口以及入口,负责初始化。
UsernamePasswordAuthenticationFilter:处理来源于表单传输的Username和Password进行认证处理,当认证成功或者失败之后都会有相应的方法(类)处理。AuthenticationManager会操作登录认证的整体流程。
FilterSericutyInterceptor:进行访问授权的验证,是用于保护Web资源的。AccessDecisionManager会操作授权访问的整体流程。
ExceptionTranslationFilter:该Filter能捕获FilterChain所有的异常,但只能处理AuthenticationException和AccessDeniedException,别的异常都会继续抛出。
(现在的实现技术种类比较多,后面实现的过程中,个别地方会用别的类代替实施,但角色不会变)
二、登录认证
1、认证流程
(1)在config中添加过滤器
(2)当接收到登录信息之后(对应流程图第一步),会由UsernamePasswordAuthenticationFilter接收,登录成功或者失败都会有相应的方法进行处理
(3)attemptAuthentication()这个方法是进行校验的。用构造一个UsernamePasswordAuthenticationToken 作为参数(对应流程图第二步),让AuthenticationManager.authenticate(upt) 调用(对应流程图第三步)。
(4)AuthenticationManager通过ProviderManager再委托给DaoAuthenticationProvider (它的父类是实现了AuthenticationProvider接口) ,(这就是对应流程第四步)
(5)DaoAuthenticationProvider.retrieveUser()调用loadUserByUsername()方法,获取一个UserDetails。(对应流程第五步)
(6)自定义一个service并实现UserDetailsService接口,同时返回的实体类要继承UserDetails;这里通过用户名在数据库中查找用户的账号密码信息,然后返回一个UserDetails的实体类对象。(对应流程第六步)
(7)将从数据库中给到的账号密码解密,并与页面提交的信息进行对比(对应流程第七步)。DaoAuthenticationProvider的父类(抽象类)中的authenticate()方法整合两种信息进行比较,认证成功后创建一个Authentication认证信息。
(8)DaoAuthenticationProvider的父类(抽象类)就一直往上返回。最后返回至UsernamePasswordAuthenticationFilter(对应流程第九步)。
2、认证后处理
(1)当认证成功之后就会生成一个JWT,放置Http协议中的头部的Authentication中,然后进行下一个过滤器的处理。而失败直接返回
(2)添加新的过滤器验证http中的Authentication信息是否有效。
(3)判断Authentication认证信息是否有效,然后将认证信息存放到SecurityContextHolder中(对应流程最后一步)。
二、授权过程
1、
(1)在配置类中设置授权的过滤器,当访问的时候会被拦截(对应流程第一步)。
(2)根据我们getAttributes()找到当前访问路径(对应流程第二步),根据访问路径从数据库中找到所需要的角色或者权限。然后就返回角色或者权限(对应流程第三步)。
(3)AccessDecisionManager.decide()方法,对权限进行匹配(对应流程第四步)
(4) 这两个方法设置为true,使用默认的投票决策(对应流程第五步)
(5)这里就是最后两步了,没找源码跟踪,但是不影响整体思路。
主要参考:
http://yun.itheima.com/course/597.html