返回介绍

9.3.1 使用 Spring 表达式进行安全保护

发布于 2024-08-17 00:45:49 字数 2325 浏览 0 评论 0 收藏 0

表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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文