Spring Security Filter详解
Spring Security Filter详解
汇总
| Filter | 作用 |
|---|---|
| DelegatingFilterProxy | Spring Security基于这个Filter建立拦截机制 |
| AbstractAuthenticationProcessingFilter | 获取用户提供的信息并创建一个部分完整的 Authentication 对象来传递凭证信息 |
| AbstractSecurityInterceptor | (最后一个filter)判断一个请求是被允许还是被拒绝 |
| LogoutFilter | 退出登录处理 |
DelegatingFilterProxy
- 要使用security必须先配置这个filter
- 这个filter是Spring框架提供的,并不是security特有
- Security使用这个filter来包装所有的应用请求
<!--web.xml-->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filterclass>
org.springframework.web.filter.DelegatingFilterProxy </filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(Abstract)AbstractAuthenticationProcessingFilter
获取用户提供的信息并创建一个部分完整的 Authentication 对象来传递凭证信息
实现类 - UsernamePasswordAuthenticationFilter
继承树
UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter
[注入](Interface)AuthenticationManager
[实现类]ProviderManager implements AuthenticationManager
[注入](Interface) AuthenticationProvider
[实现类]DaoAuthenticationProvider implements AuthenticationProvider
[注入]UserDetailsService
[实现类]InMemoryDaoImpl implements UserDetailsService
作用描述
- ProviderManager 注入 UserDetails 获取 o.s.s.core.userdetails.UserDetails (用户信息)
- AuthenticationManager 校验用户的凭证信息,用户无效会抛出一个特定的异常 成功会补全Authentication的信息(如权限信息)
作用流程
(AbstractAuthenticationProcessingFilter) ( j_spring_security_check)
UsernamePasswordAuthenticationFilter → 拦截到用户登录
创建一个 Authentication
(UsernamePasswordAuthenticationToken)
↓
(AuthenticationManager)
ProviderManager
↓ 获取并且验证用户信息
(AuthenticationProvider)
DaoAuthenticationProvider
↓ 获取合法用户信息
(UserDetailsService)
InMemoryDaoImpl
↓ 查询合法用户信息
Memory Store
配置authenticationManager
<!--org.springframework.security.authentication.ProviderManager-->
<authentication-manager alias="authenticationManager">
<!-- o.s.s.authentication.dao.DaoAuthenticationProvider-->
<authentication-provider>
<!-- o.s.s.core.userdetails.memory.InMemoryDaoImpl -->
<user-service>
<user authorities="ROLE_USER" name="guest" password="guest"/>
</user-service>
</authentication-provider>
</authentication-manager>
(Abstract)AbstractSecurityInterceptor
判断一个请求是被允许还是被拒绝
- 最后一个servelt 过滤器
- 通过DefaultFilterInvocationSecurityMetadataSource获取需要的权限列表(ConfigAttribute)
- 委托一个AccessDecisionManager完成授权的判断
实现类 - FilterSecurityInterceptor extends AbstractSecurityInterceptor
作用流程
//访问资源(即授权管理)
user request url
↓
(AbstractSecurityInterceptor)
FilterSecurityInterceptor
↓(获取配置的权限信息)
FilterInvocationSecurityMetadataSource
↓(委托一个AccessDecisionManager完成授权的判断)
AccessDecisionManager(需要获取AccessDecisionVoters)
↓
返回决策结果
(Interface)o.s.s.access.AccessDecisionManager
- 提供了一个基于AccessDecisionVoter 接口和投票集合的授权机制。
- supports:这个逻辑操作实际上包含两个方法,它们允许AccessDecisionManager 的实现
类判断是否支持当前的请求。 - decide:基于请求的上下文和安全配置,允许AccessDecisionManager 去核实访问是否被
允许以及请求是否能够被接受。decide 方法实际上没有返回值,通过抛出异常来表明对
请求访问的拒绝。
AbstractAccessDecisionManager implements AccessDecisionManager
AbstractAccessDecisionManager 实现类
org.springframework.security.access.vote.UnanimousBased
所有的投票器必须全是允许的,否则访问将被拒绝
org.springframework.security.access.vote.AffirmativeBased
如果有任何一个投票器允许访问,请求将被立刻允许
org.springframework.security.access.vote.ConsensusBased
多数票决定
配置
<http auto-config="true" access-decision-manager-ref="unanimousBased" >
<!--AccessDecisionManager-->
<bean class="org.springframework.security.access.vote.UnanimousBased" id="unanimousBased">
<property name="decisionVoters">
<list>
<ref bean="roleVoter"/>
<ref bean="authenticatedVoter"/>
</list>
</property>
</bean>
<!-- 检查用户是否拥有声明角色的权限 (GrantedAuthority) access="ROLE_USER,ROLE_ ADMIN"-->
<bean class="org.springframework.security.access.vote.RoleVoter" id="roleVoter"/>
<!--支持特定类型的声明,允许使用通配符-->
<bean class="org.springframework.security.access.vote.AuthenticatedVoter" id="authenticatedVoter"/>
LogoutFilter
- 使得HTTP session 失效(如果invalidate-session 属性被设置为true);
- 清除SecurityContex(真正使得用户退出);
- 将页面重定向至logout-success-url 指明的URL。
<http auto-config="true" use-expressions="true">
<logout invalidate-session="true"
logout-success-url="/"
logout-url="/j_spring_security_logout"/>
</http>
| 属性 | 作用 |
|---|---|
| invalidate-session | 如果被设置为true,用户的HTTP session 将会在退出时被失效 |
| logout-success-url | 用户在退出后将要被重定向到的URL |
| logout-url | 要读取的URL |
Spring Security Filter详解的更多相关文章
- Spring Security 入门详解(转)
1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完整的安全性解决方案,能够在web请求级别和方法调用级别 处理 ...
- Spring Security 入门详解
序:本文主要参考 spring实战 对里面的知识做一个梳理 1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完 ...
- Spring jar包详解
Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...
- Spring——jar包详解(转)
Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...
- spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途
Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- Spring Boot异常处理详解
在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...
- spring事务配置详解
一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...
- spring注入参数详解
spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...
随机推荐
- Windows下安装Nodejs步骤
最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...
- Linux环境g++编译TinyXML动态库
除了CMarkup,tinyxml也是C/C++下解析XML很好的工具.在linux下用g++编译tinyxml的步骤如下(tinyxml版本2.6.2): 进入tinyxml解压目录,用文本编辑器打 ...
- SQLServer 延迟事务持久性
SQL Server 2014新功能 -- 延迟事务持久性(Delayed Transaction Durability) SQL Server事务提交默认是完全持久性的(Full Durable), ...
- STM32的RFID射频读写控制装置
,大二上学期做的,过了很久,先上一下图: 这并不是做个最后一版:主体是RC552+STM32+1062:蜂鸣器,继电器,LED等:反正最后的效果就是,刷一下卡,1602显示一下持卡人(需要提前注册,注 ...
- 028hibernate缓存(性能优化策略)
一级缓存 二级缓存 查询缓存 缓存是为了提高性能 变化不是很大,相对静态的对象放入缓存 对象的创建比较耗时
- Http学习之使用HttpURLConnection发送post和get请求(2)
接上节Http学习之使用HttpURLConnection发送post和get请求 本节深入学习post请求. 上 节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在ge ...
- 开涛spring3(4.2) - 资源 之 4.2 内置Resource实现
4.2 内置Resource实现 4.2.1 ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个By ...
- JS 浏览器cookie的设置,读取,删除
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...
- C# 特性参数(注解属性加在参数前面)
特性参数 webapi 框架里有很多特性参数,为了解除一些新人的疑惑,写个小例子分享下. class Program { static void Main(string[] args) { var m ...
- Unity游戏程序员面试题及解答
典型的一些如手写排序算法.一些基本数学问题,在此就不列举了.以下整理出一些代表性的.有参考价值的题,真实面试题,附有本人的解答,欢迎讨论. 题1.指出下列哪些属于值类型? int System.Obj ...