- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
9.3.1 使用 Spring 表达式进行安全保护
表9.4中的大多数方法都是一维的,也就是说我们可以使用hasRole()限制某个特定的角色,但是我们不能在相同的路径上同时通过hasIpAddress()限制特定的IP地址。
另外,除了表9.4定义的方法以外,我们没有办法使用其他的条件。如果我们希望限制某个角色只能在星期二进行访问的话,该怎么办呢?
在第3章中,我们看到了如何使用Spring表达式语言(Spring Expression Language,SpEL),将其作为装配bean属性的高级技术。借助access()方法,我们也可以将SpEL作为声明访问限制的一种方式。例如,如下就是使用SpEL表达式来声明具有“ROLE_SPITTER”角色才能访问“/spitter/me”URL:
这个对“/spitter/me”的安全限制与开始时的效果是等价的,只不过这里使用了SpEL来描述安全规则。如果当前用户被授予了给定角色的话,那hasRole()表达式的计算结果就为true。
让SpEL更强大的原因在于,hasRole()仅是Spring支持的安全相关表达式中的一种,表9.5列出了Spring Security支持的所有SpEL表达式。
表9.5 Spring Security通过一些安全性相关的表达式扩展了Spring表达式语言
安全表达式 | 计 算 结 果 |
authentication | 用户的认证对象 |
denyAll | 结果始终为false |
hasAnyRole(list of roles) | 如果用户被授予了列表中任意的指定角色,结果为true |
hasRole(role) | 如果用户被授予了指定的角色,结果为true |
hasIpAddress(IP Address) | 如果请求来自指定IP的话,结果为true |
isAnonymous() | 如果当前用户为匿名用户,结果为true |
isAuthenticated() | 如果当前用户进行了认证的话,结果为true |
isFullyAuthenticated() | 如果当前用户进行了完整认证的话(不是通过Remember-me功能进行的认证),结果为true |
isRememberMe() | 如果当前用户是通过Remember-me自动认证的,结果为true |
permitAll | 结果始终为true |
principal | 用户的principal对象 |
在掌握了Spring Security的SpEL表达式后,我们就能够不再局限于基于用户的权限进行访问限制了。例如,如果你想限制“/spitter/me” URL的访问,不仅需要ROLE_SPITTER,还需要来自指定的IP地址,那么我们可以按照如下的方式调用access()方法:
我们可以使用SpEL实现各种各样的安全性限制。我敢打赌,你已经在想象基于SpEL所能实现的那些有趣的安全性限制了。
但现在,让我们看一下Spring Security拦截请求的另外一种方式:强制通道的安全性。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论