`
kong0itey
  • 浏览: 307812 次
社区版块
存档分类
最新评论

《Spring Security3》第二章第三部分翻译(中)(转载)

阅读更多

 

请求是怎样被授权的?

Spring Security 的默认过滤器链中,最后一个 servelt 过滤器是 FilterSecurityInterceptor ,它的作用是判断一个特定的请求是被允许还是被拒绝。在 FilterSecurityInterceptor 被触发的时候,安全实体已经经过了认证,所以系统知道他们是合法的用户。(其实也有可能是匿名的用户,译者注)。请记住的一点是, Authentication 提供了一个方法( (List<GrantedAuthority>

getAuthorities() ),将会返回当前安全实体的一系列权限列表。授权的过程将使用这个方法提供的信息来决定一个特定的请求是否会被允许。

 

需要记住的是授权是一个二进制的决策——一个用户要么有要么没有访问一个受保护资源的权限。在授权中,没有模棱两可的情景。

Spring Security 中,良好的面向对象设计随处可见,在授权决策管理中也不例外。回忆一下我们在本章前面的讨论,一个名为访问控制决策器( access decision manager )的组件负责作出授权决策。

Spring Security 中, o.s.s.access.AccessDecisionManager 接口定义了两个简单而合理的方法,它们能够用于请求的决策判断流程:

<!--[if !supportLists]-->l  <!--[endif]-->supports :这个逻辑操作实际上包含两个方法,它们允许 AccessDecisionManager 的实现类判断是否支持当前的请求。

<!--[if !supportLists]-->l  <!--[endif]-->decide :基于请求的上下文和安全配置,允许 AccessDecisionManager 去核实访问是否被允许以及请求是否能够被接受。 decide 方法实际上没有返回值,通过抛出异常来表明对请求访问的拒绝。

 

AuthenticationException 及其子类在认证过程中的使用很类似,特定类型的异常能够表明应用在授权决策中的不同处理结果。 o.s.s.access.AccessDeniedException 是在授权领域里最常见的异常,因此值得过滤器链进行特殊的处理。我们将在第六章中详细介绍它的高级配置。

AccessDecisionManager 是能够通过标准的 Spring bean 绑定和引用实现完全的自定义配置。 AccessDecisionManager 的默认实现提供了一个基于 AccessDecisionVoter 接口和投票集合的授权机制。

投票器( voter )是在授权过程中的一个重要角色,它的作用是评估以下的内容:

<!--[if !supportLists]-->l  <!--[endif]-->要访问受保护资源的请求所对应上下文(如 URL 请求的 IP 地址);

<!--[if !supportLists]-->l  <!--[endif]-->用户的凭证信息(如果存在的话);

<!--[if !supportLists]-->l  <!--[endif]-->要试图访问的受保护资源;

<!--[if !supportLists]-->l  <!--[endif]-->系统的配置以及要访问资源本身的配置参数。

AccessDecisionManager 还会负责传递要请求资源的访问声明信息(在代码中为 ConfigAttribute 接口的实现类)给投票器。在 web URL 的请求中,投票器将会得到资源的访问声明信息。如果看一下我们配置文件中非常基础的拦截声明,我们能够看到 ROLE_USER 被设置为访问配置并用于用户试图访问的资源:

 

<intercept-url pattern="/*" access="ROLE_USER"/>

投票器将会对用户是否能够访问指定的资源做出一个判断。 Spring Security 允许过滤器在三种决策结果中做出一种选择,它们的逻辑定义在 o.s.s.access.AccessDecisionVoter 接口中通过常量进行了定义。

决策类型

描述

Grant (ACCESS_GRANTED)

投票器允许对资源的访问

Deny (ACCESS_DENIED)

投票器拒绝对资源的访问

Abstain (ACCESS_ABSTAIN)

投票器对是否能够访问做了弃权处理(即没有做出决定)。可能在多种原因下发生,如:

<!--[if !supportLists]-->l  <!--[endif]-->投票器没有确凿的判断信息;

<!--[if !supportLists]-->l  <!--[endif]-->投票器不能对这种类型的请求做出决策。

正如你从访问决策相关类和接口的设计中可以猜到的那样, Spring Security 的这部分被精心设计,所以认证和访问控制的使用场景并不仅仅限于 web 领域。我们将会在:精确的访问控制 中关于方法级别的安全时,再次讲解投票器和访问控制管理。

当将他们组合在一起,“对 web 请求的默认认证检查”的整体流程将如下图所示:



 我们可以看到 ConfigAttribute 能够从配置声明(在 DefaultFilterInvocationSecurityMetadataSource 类中保存)中传递数据到投票器,投票器并不需要其他的类来理解 ConfigAttribute 的内容。这种分离能够为新类型的安全声明(例如我们将要看到的方法安全声明)使用相同的访问决策模式提供基础。

配置 access decision 集合

实际上 Spring Security 允许通过 security 命名空间来配置 AccessDecisionManager <http> 元素的 access-decision-manager-ref 属性来指明一个实现了 AccessDecisionManager Spring Bean Spring Security 提供了这个接口的三个实现类,都在 o.s.s.access.vote 包中:

类名

描述

AffirmativeBased

如果有任何一个投票器允许访问,请求将被立刻允许,而不管之前可能有的拒绝决定。

ConsensusBased

多数票(允许或拒绝)决定了 AccessDecisionManager 的结果。平局的投票和空票(全是弃权的)的结果是可配置的。

UnanimousBased

所有的投票器必须全是允许的,否则访问将被拒绝。

 

配置使用 UnanimousBased 的访问决策管理器( access decision manager

如果你想修改我们的应用来使用 UnanimousBased 访问决策管理器,我们需要修改两个地方。首先让我们在 <http> 元素上添加 access-decision-manager-ref 属性:

 

<http auto-config="true"

      access-decision-manager-ref="unanimousBased" >

这是一个标准的 Spring Bean 的引用,所以这需要对应一个 bean id 属性。接下来,我们要定义这个 bean (在 dogstore-base.xml 中),并与我们引用的有相同的 id

 

<bean class="org.springframework.security.access.vote.UnanimousBased"

      id="unanimousBased">

  <property name="decisionVoters">

    <list>

      <ref bean="roleVoter"/>

      <ref bean="authenticatedVoter"/>

    </list>

  </property>

</bean>

<bean class="org.springframework.security.access.vote.RoleVoter"

id="roleVoter"/>

<bean class="org.springframework.security.access.vote.

AuthenticatedVoter" id="authenticatedVoter"/>

你可能象知道 decisionVoters 属性是什么。这个属性在我们不声明 AccessDecisionManager 时,是自动配置的。默认的 AccessDecisionManager 要求我们配置投票器的一个列表,它们将会在认证决策时用到。这里列出的两个投票器是 security 命名空间配置默认提供的。

遗憾的是, Spring Security 没有为我们提供太多的投票器,但是实现 AccessDecisionVoter 接口并在配置中添加我们的实现并不是一件困难的事情。我们将在第六章看一个例子。

我们引用的两个投票器介绍如下:

类名

描述

例子

o.s.s.access.

vote.RoleVoter

检查用户是否拥有声明角色的权限( GrantedAuthority )。 access 属性定义了 GrantedAuthority 的一个列表。预期会有 ROLE_ 前缀,但这也是可配置的。

access="ROLE_USER,ROLE_ADMIN"

o.s.s.access.

vote.AuthenticatedVoter

支持特定类型的声明,允许使用通配符:

<!--[if !supportLists]-->l  <!--[endif]-->IS_AUTHENTICATED_FULLY ——允许提供完整的用户名和密码的用户访问;

<!--[if !supportLists]-->l  <!--[endif]-->IS_AUTHENTICATED_REMEMBERED ——如果用户是通过 remember me 功能认证的则允许访问;

<!--[if !supportLists]-->l  <!--[endif]-->IS_AUTHENTICATED_ANONYMOUSLY ——允许匿名用户访问。

access=" IS_AUTHENTICATED_ANONYMOUSLY"

分享到:
评论

相关推荐

    Spring Security3中文文档

    ### 第二章:深入理解Spring Security3 本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全...

    《Spring Security3》第二章第三部分翻译(下)附前两章doc文档

    《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...

    springSecurity3中文文档

    第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...

    Spring Security3

    #### 第二章:Spring Security起步 **安全的核心概念** - **认证**:验证用户身份的过程。 - **授权**:根据认证结果决定用户可以执行的操作。 **实现步骤** 1. **配置Spring Security的XML文件**: - 定义了安全...

    spring security3中文文档

    #### 第二章:Spring Security起步 - **安全的核心概念**:深入探讨认证与授权等核心概念。 - **认证**:详细介绍认证的过程及其实现方式。 - **授权**:讲解授权的概念以及在Spring Security中的实现方式。 - **三...

    spring security 安全权限管理手册

    ##### 第3章:自定义数据库表结构 **3.1 自定义表结构** 在某些情况下,可能希望使用自定义的表结构来存储用户和权限信息。例如,可能需要添加额外的字段来支持更多的业务需求。 **3.2 初始化数据** 同样,需要...

    Spring Security3 中文版 张卫滨 推荐

    ### 第二章:Spring Security起步 这一章重点介绍了如何快速集成Spring Security到现有的项目中。 - **安全的核心概念**:深入浅出地解释了安全领域的重要概念,如认证、授权等。 - **实现Spring Security的XML...

    SpringSecurity 中文

    #### 第二章:Spring Security 起步 **安全的核心概念** - **认证**:验证用户身份的过程。 - **授权**:根据用户的角色和权限决定其可以访问哪些资源。 **三步之内使我们的应用变得安全** 1. **配置Spring ...

    Spring Security权限管理开发手册

    - **第3章:自定义数据库表结构** - **自定义表结构:** 根据项目的具体需求,自定义数据库表结构以存储更加复杂的用户信息和权限数据。 - **初始化数据:** 在数据库中填充初始数据,以便后续的测试和验证。 - *...

    Pro+Spring+Security

    第二章:介绍Spring Security(Introducing Spring Security) - Spring Security概述:解释Spring Security框架的作用以及如何在Spring应用中集成安全功能。 - 基础配置:介绍如何设置Spring Security的基本配置,...

    springsecurity3.x快速构建企业级安全

    通过以上内容的梳理和总结,《Spring Security 3.x 快速构建企业级安全》这本书为开发者提供了全面且实用的知识体系,有助于理解和掌握 Spring Security 在企业级应用中的实践。无论是初学者还是有经验的开发者,都...

    Spring Security权限管理开发手册.pdf

    ### 第3章:自定义数据库表结构 讲解了自定义数据库表结构的方法,包括初始化数据、获取用户权限信息的流程,特别关注了用户登录和权限检查的实现。 ### 第4章:自定义登录页面 介绍如何实现自定义登录页面,包括...

    Spring攻略PDF版

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案...

    spring-security-oauth2文档

    在选择使用`spring-security-oauth2`和`spring-security-oauth2-autoconfigure`之前,建议先查看Spring Security的新特性矩阵,以确认这些工具是否能满足需求,或者是否有更适合的方案,如Spring Security 5中对...

    Spring攻略中文版PDF

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案...

    spring3核心包及第三方插件包

    Spring3 是一个强大的Java应用程序框架,它以IoC(Inversion of Control)和AOP(Aspect ...而"chapter2"可能包含的是书中的第二章内容,具体涉及了Spring框架的初步介绍和基本配置,是学习整个Spring3体系的基石。

    Spring攻略英文版(附带源码)

     第3章 Spring中的Bean配置   3.1 在Spring IoC容器里配置Bean   3.1.1 问题描述   3.1.2 解决方案   3.1.3 实现方法   3.2 实例化Spring IoC容器   3.2.1 问题描述   3.2.2 解决方案   ...

    spring security详解

    - **第3章 自定义数据库表结构**: - **自定义表结构**:根据项目需求设计自定义的数据库表结构。 - **初始化数据**:向数据库中插入初始用户数据。 - **获得自定义用户权限信息**: - **处理用户登录**:学习...

    springlive(共11章)

    2. **第二章:搭建Spring环境** - 安装与配置:介绍如何配置Java开发环境,包括JDK、IDE和构建工具如Maven或Gradle。 - 创建第一个Spring项目:逐步指导创建一个简单的Spring项目,体验Spring的基本配置。 3. **...

    spring in action 第二版 中文 3(共3个)

    在压缩包中包含的两个部分分别是“Spring+in+Action(第二版)中文版(381-450).pdf”和“Spring+in+Action(第二版)中文版(451-505).pdf”,这代表了书籍的两个章节段落。根据页码范围,我们可以推测这些章节涵盖了...

Global site tag (gtag.js) - Google Analytics