- 浏览: 304867 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
使用 Spring 表达式语言配置访问控制
基于角色标准投票机制的标准实现是使用 RoleVoter ,还有一种替代方法可用来定义语法复杂的投票规则即使用 Spring 表达式语言( SpEL )。要实现这一功能的直接方式是在 <http> 配置元素上添加 use-expressions 属性:
<http auto-config="true" use-expressions="true"> |
添加后将要修改用来进行拦截器规则声明的 access 属性,改为 SpEL 表达式。 SpEL 允许使用特定的访问控制规则表达式语言。与简单的字符串如 ROLE_USER 不同,配置文件可以指明表达式语言触发方法调用、引用系统属性、计算机值等等。
SpEL 的语法与其他的表达式语言很类似,如在 Tapestry 等框架中用到的 Object Graph Notation Language (OGNL) ,以及用于 JSP 和 JSF 的 Unified Expression Language 。它的语法面很广,已经超出了本书的覆盖范围,我们将会通过几个例子为你构建表达式提供一些确切的帮助。
需要注意的重要一点是,如果你通过使用 use-expressions 属性启用了 SpEL 表达式访问控制,将会使得自动配置的 RoleVoter 实效,后者能够使用角色的声明,正如在前面的例子所见到的那样:
<intercept-url pattern="/*" access="ROLE_USER"/> |
这意味着如果你仅仅想通过角色来过滤请求的话,访问控制声明必要要进行修改。幸运的的是,这已经被充分考虑过了,一个 SpEL 绑定的方法 hasRole 能够检查角色。如果我们要使用表达式来重写例子的配置,它可能看起来如下所示:
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/*" access="hasRole('ROLE_USER')"/> </http> |
正如你可能预料的那样, SpEL 使用了一个不同的 Voter 实现类,即 o.s.s.web.access.expression.WebExpressionVoter ,它能理解怎样解析 SpEL 表达式。 WebExpressionVoter 借助于 o.s.s.web.access.expression.WebSecurityExpressionHandler 接口的一个实现类来达到这个目的。 WebSecurityExpressionHandler 同时负责评估表达式的执行结果以及提供在表达式中应用的安全相关的方法。这个接口的默认实现对外暴露了 o.s.s.web.access.expression.WebSecurityExpressionRoot 类中定义的方法。
这些类的流程以及关系如下图所示:
为实现
SpEL
访问控制表达式的方法和伪属性(
pseudo-property
)在类
WebSecurityExpessionRoot
及其父类的公共方法中进行了声明。
【伪属性( pseudo-property )是指没有传入参数并符合 JavaBeans 的 getters 命名格式的方法。这允许 SpEL 表达式能够省略方法的圆括号以及 is 或 get 的前缀。如 isAnonymous() 方法可以通过 anonymous 伪属性来访问。】
Spring Security 3 提供的 SpEL 方法和伪属性在以下的表格中进行了描述。要注意的是没有被标明“ web only ”的方法和属性可以在保护其他类型的资源中使用,如在保护方法调用时。示例表示的方法和属性是使用在 <intercept-url> 的 access 声明中。
方法 |
Web only? |
描述 |
示例 |
hasIpAddress (ipAddress) |
Yes |
用于匹配一个请求的 IP 地址或一个地址的网络掩码 |
access="hasIpAddress(' 162.79.8.30')" access="hasIpAddress(' 162.0.0.0/224')" |
hasRole(role) |
No |
用于匹配一个使用 GrantedAuthority 的角色(类似于 RoleVoter ) |
access="hasRole('ROLE USER')" |
hasAnyRole(role) |
No |
用于匹配一个使用 GrantedAuthority 的角色列表。用户匹配其中的任何一个均可放行。 |
access="hasRole('ROLE_ USER','ROLE_ADMIN')" |
除了以上表格中的方法,在 SpEL 表达式中还有一系列的方法可以作为属性。它们不需要圆括号或方法参数。
属性 |
Web only? |
描述 |
例子 |
permitAll |
No |
任何用户均可访问 |
access="permitAll" |
denyAll |
NO |
任何用户均不可访问 |
access="denyAll" |
anonymous |
NO |
匿名用户可访问 |
access="anonymous" |
authenticated |
NO |
检查用户是否认证过 |
access="authenticated" |
rememberMe |
No |
检查用户是否通过 remember me 功能认证的 |
access="rememberMe" |
fullyAuthenticated |
No |
检查用户是否通过提供完整的凭证信息来认证的 |
access="fullyAuthenticated" |
需要记住的是, voter 的实现类必须基于请求的上下文返回一个投票的结果(允许、拒绝或者弃权)。你可能会认为 hasRole 会返回一个 Boolean 值,实际上正是如此。基于 SpEL 的访问控制声明必须是返回 Boolean 类型的表达式。返回值为 true 意味着投票器的结果是允许访问, false 的结果意味着投票器拒绝访问。
【如果一个表达式的值不是 Boolean 类型的,你将会得到如下的一个异常信息: org.springframework.expression.spel.SpelException:
EL1001E:Type conversion problem, cannot convert from
class java.lang.Integer to java.lang.Boolean 】
另外,表达式不能返回一个弃权类型的结果,除非访问控制声明不是一个合法 SpEL 表达式,在这种情况下投票器将会放弃投票。
如果你不在乎这些细小的约束, SpEL 访问控制声明能够提供一种灵活的配置访问控制决策的方式。
在本章中,我们提供了安全领域两个重要概念即认证和授权的介绍。
l 在总体上了解我们要进行安全保护的系统;
l 使用 Spring Security 的自动配置在三步之内实现了我们应用的安全配置;
l 了解了在 Spring Security 中 servlet 过滤器的使用及重要性;
l 了解了认证和授权过程中重要的角色,包括一些重要类实现的详细介绍如 Authentication 和 UserDetails
l 体验了与访问控制规则有关的 SpEL 表达式的配置。
在接下来的一章中,我们将通过添加一些增强用户体验的功能,把基于用户名和密码的认证提高一个新的水平。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 10442、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 935最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2668作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1057一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3447不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1740笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1341认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1053Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 1009手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1235理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4227Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1513实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1117第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 1051方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 877保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1024使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 958实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 948第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1248将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1800你是否愿意在密码上添加点salt ? 如果安 ...
相关推荐
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
### 第二章:深入理解Spring Security3 本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全...
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
#### 第二章:Spring Security起步 **安全的核心概念** - **认证**:验证用户身份的过程。 - **授权**:根据认证结果决定用户可以执行的操作。 **实现步骤** 1. **配置Spring Security的XML文件**: - 定义了安全...
### 第二章:Spring Security起步 这一章重点介绍了如何快速集成Spring Security到现有的项目中。 - **安全的核心概念**:深入浅出地解释了安全领域的重要概念,如认证、授权等。 - **实现Spring Security的XML...
#### 第二章:Spring Security起步 - **安全的核心概念**:深入探讨认证与授权等核心概念。 - **认证**:详细介绍认证的过程及其实现方式。 - **授权**:讲解授权的概念以及在Spring Security中的实现方式。 - **三...
- **第3章:自定义数据库表结构** - **自定义表结构:** 根据项目的具体需求,自定义数据库表结构以存储更加复杂的用户信息和权限数据。 - **初始化数据:** 在数据库中填充初始数据,以便后续的测试和验证。 - *...
第二章:介绍Spring Security(Introducing Spring Security) - Spring Security概述:解释Spring Security框架的作用以及如何在Spring应用中集成安全功能。 - 基础配置:介绍如何设置Spring Security的基本配置,...
#### 第二章:Spring Security 起步 **安全的核心概念** - **认证**:验证用户身份的过程。 - **授权**:根据用户的角色和权限决定其可以访问哪些资源。 **三步之内使我们的应用变得安全** 1. **配置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 OAuth2 Boot 2.6.8版本概述 Spring Security OAuth2 Boot 2.6.8作为最后一版的官方文档,提供了关于如何使用Spring Security OAuth2 Boot来简化授权和资源服务器设置的方法。这一版本支持...
第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 是一个强大的Java应用程序框架,它以IoC(Inversion of Control)和AOP(Aspect ...而"chapter2"可能包含的是书中的第二章内容,具体涉及了Spring框架的初步介绍和基本配置,是学习整个Spring3体系的基石。
第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 解决方案 ...
2. **第二章:搭建Spring环境** - 安装与配置:介绍如何配置Java开发环境,包括JDK、IDE和构建工具如Maven或Gradle。 - 创建第一个Spring项目:逐步指导创建一个简单的Spring项目,体验Spring的基本配置。 3. **...
在压缩包中包含的两个部分分别是“Spring+in+Action(第二版)中文版(381-450).pdf”和“Spring+in+Action(第二版)中文版(451-505).pdf”,这代表了书籍的两个章节段落。根据页码范围,我们可以推测这些章节涵盖了...