一、入门案例
二、基本原理
SpringSecurity本质是一个过滤器链;
有很多的过滤器;
代码底层流程:重点看三个过滤器:
FilterSecurityInterceptor:是一个方法级的权限过滤器,基本位于过滤链的最底部;
ExceptionTranslationFilter:是一个异常过滤器,用来处理在认证授权过程中抛出的异常;
UsernamePasswordAuthenticationFilter:对/login的POST请求做拦截,校验表单中用户名,密码;
过滤器如何加载的?
1、所使用的SpringSecurity配置过滤器
* DelegatingFilterProxy
核心组件:SecurityContextHolder、SecurityContext、Authentication
2、两个重要的接口
1、UserDetailService接口:查询数据库用户名和密码过程
* 创建类继承UsernamePasswordAuthenticationFilter,重写三个方法
* 创建类实现UserDetailService,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象;
2、PasswordEncoder接口:数据加密接口,用于返回User对象里面的密码加密;
Web权限方案
(1)认证
登录时:
登录时提交post请求,提交登录时会走一个过滤器UsernamePasswordAuthenticationFilter
权限判断:
判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。
(2)授权
SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤
器链的 15 个过滤器进行说明:
(1) WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于
处理异步请求映射的 WebAsyncManager 进行集成。
(2) SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上
下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将
SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将
SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信
息就是这个过滤器处理的。
(3) HeaderWriterFilter:用于将头信息加入响应中。
(4) CsrfFilter:用于处理跨站请求伪造。
(5)LogoutFilter:用于处理退出登录。
(6)UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中
获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码
时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个
过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改。
(7)DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会
配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。
(8)BasicAuthenticationFilter:检测和处理 http basic 认证。
(9)RequestCacheAwareFilter:用来处理请求的缓存。
(10)SecurityContextHolderAwareRequestFilter:主要是包装请求对象 request。
(11)AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在
Authentication 对象,如果不存在为其提供一个匿名 Authentication。
(12)SessionManagementFilter:管理 session 的过滤器
(13)ExceptionTranslationFilter:处理 AccessDeniedException 和
AuthenticationException 异常。
(14)FilterSecurityInterceptor:可以看做过滤器链的出口。
(15)RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie
里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie,
用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。
整体的认证流程
UsernamePasswordAuthenticationFilter
extends AbstractAuthenticationProcessingFilter
UsernamePasswordAuthenticationFilter的attemptAuthentication() 方法
UsernamePasswordAuthenticationToken
是
Authentication 接口的实现类,该类有两个构造器,一个用于封装前端请求传入的未认
证的用户信息,一个用于封装认证成功后的用户信息
ProviderManager
是
AuthenticationManager
接口的实现类,该接口是认证相关的核心接
口,也是认证的入口。些认证方式的入口:AuthenticationManager
。
权限访问流程
ExceptionTranslationFilter 过滤器
该过滤器是用于处理异常的,不需要我们配置,对于前端提交的请求会直接放行,捕获后
续抛出的异常并进行处理。
FilterSecurityInterceptor
过滤器
FilterSecurityInterceptor 是过滤器链的最后一个过滤器,根据资源权限配置来判断当前请求是否有权限访问对应的资源。如果
访问受限会抛出相关异常,最终所抛出的异常会由前一个过滤器
ExceptionTranslationFilter
进行捕获和处理。