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详解的更多相关文章

  1. Spring Security 入门详解(转)

    1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完整的安全性解决方案,能够在web请求级别和方法调用级别 处理 ...

  2. Spring Security 入门详解

    序:本文主要参考 spring实战 对里面的知识做一个梳理 1.Spring Security介绍 Spring Security是基于spring的应用程序提供声明式安全保护的安全性框架,它提供了完 ...

  3. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  4. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  5. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  6. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  7. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  8. spring事务配置详解

    一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...

  9. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

随机推荐

  1. CSS3如何实现超出指定文本以省略号显示效果

    不做前端很久了,今天从重构师那里了解到CSS3已经可以实现很多以往必须通过JS才能实现的效果,如渐变,阴影,自动截断文本展示省略号等等强大效果,而且这些功能日渐成熟,已经大量用于生产环境.H5真的日渐 ...

  2. C++ 大作业 超市收银系统

    #include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...

  3. 白话讲session

    什么是session Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器 ...

  4. 给sftp创建新用户、默认打开和限制在某个目录

    一.环境: CentOS 6.8 使用 FileZilla 进行 sftp 连接 二.背景 给外包的工作人员提供我司服务器的某一目录的访问(包括读写)权限,方便他们部署代码文件. 之所以是某一目录的访 ...

  5. Servlet 详解

    1.什么是 Servlet? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...

  6. 你为什么必须(从现在开始就)掌握linux

    写在前面 在我看来,人人都应该学习linux,但这不是本文探讨的重点.本文主要从软件测试人员的角度谈谈学习和掌握linux的重要性.必要性.紧迫性. 另外: 这里所说的linux系统,是unix系统和 ...

  7. 看过WWDC2017的闲谈

    2017年6月6日凌晨的138分钟,是属于WWDC2017的. 鉴于时间问题,没有熬夜看,所以早上起来趁着公司不太忙就看了看.整体的内容没有太多变化,依然是苹果的主产品,不过这次的one more t ...

  8. FTP主动模式和被动模式的区别

    基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常21端口是命令端口,20端口是数据端口.当 ...

  9. Publishing failed with multiple errors.问题解决

    问题:Publishing failed with multiple errors.(发布失败与多个错误) 原因:项目工程文件删除,但eclipse里面仍显示存在. 解决方案:刷新项目工程,重新部署, ...

  10. python爬虫从入门到放弃(九)之 实例爬取上海高级人民法院网开庭公告数据

    通过前面的文章已经学习了基本的爬虫知识,通过这个例子进行一下练习,毕竟前面文章的知识点只是一个 一个单独的散知识点,需要通过实际的例子进行融合 分析网站 其实爬虫最重要的是前面的分析网站,只有对要爬取 ...