SpringSecurity

一、入门案例

二、基本原理

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 进行捕获和处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值