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. Java字符串连接最佳实践

    一个小问题,分享给大家. + 操作和 StringBuilder 都能连接字符串,使用+来拼接字符串,使用javap命令来反编译代码,可以看出实际上编译器会自动创建StringBuilder,调用它的 ...

  2. javascript之深入剖析this

    this的重要性不言而喻,比如面试题经常考到,其次,如果彻底理解了this,那么对理解框架源码及编写高质量代码都有很大的帮助.本文就是要深入剖析this的几种情况,理解了原理,以后妈妈再也不用担心你的 ...

  3. 【JAVAWEB学习笔记】28_jqueryAjax:json数据结构、jquery的ajax操作和表单校验插件

    Ajax-jqueryAjax 今天内容: 1.json数据结构(重点) 2.jquery的ajax操作(重点) 3.jquery的插件使用   一.json数据结构 1.什么是json JSON(J ...

  4. Spring-bean作用域scope详解

    Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext). singleton 在每个Spring IoC容器中一个bean定 ...

  5. JavaScript 闭包究竟是什么

    用JavaScript一年多了,闭包总是让人二丈和尚摸不着头脑.陆陆续续接触了一些闭包的知识,也犯过几次因为不理解闭包导致的错误,一年多了 资料也看了一些,但还是不是非常明白,最近偶然看了一下 jQu ...

  6. 汽车Vin码识别——可以嵌入到手机里的新OCR识别技术

              汽车Vin码识别(车架号识别),顾名思义,就是识别汽车的Vin码(车架号),汽车Vin码识别(车架号识别)利用的是OCR识别技术,支持视频流获取图像,自动触发识别,另外汽车Vin码 ...

  7. AngularJS入门第一课

    1.ng-app=" "   定义angularJS的使用范围: 2.ng-init="变量=值;变量='值'"   初始化变量的值,有多个变量时,中间用分号隔 ...

  8. Detailed Information for Outputted Files from Somatic Mutation Annotators(annovar 注释文件条目详细解释)

    CONTENTS *_annoTable.txt (ANNOVAR) *_annoTable.txt (SnpEff) *_genelist.txt (ANNOVAR & SnpEff) db ...

  9. react 热替换 ([HMR])

    react 热替换 ([HMR]) 热替换好多地方可以用到,目前比较流行的用法是搭配React和webpack实现在不刷新页面的情况下对模块的增删改.在给项目添加热替换功能的时候,可以说是踩了各种坑, ...

  10. 排序与检索【UVa10474】Where is the Marble?

    Where is the Marble?  DescriptionRaju and Meena love to play with Marbles. They have got a lot of ma ...