首页 > 代码库 > Spring Security应用开发(16)基于表达式的访问控制

Spring Security应用开发(16)基于表达式的访问控制

1.1.1. 通用表达式 

Spring Security 使用基于Spring EL的表达式来进行访问控制。内置的表达式如下表所示:

 

表达式

描述

hasRole(role)

当前主体(principal)是否支持role角色。支持则返回true

hasAnyRole(role1,role2)

当前主体是否支持role1,role2中的任意一个角色。

hasAuthority(authority)

hasRole(role)相似。

hasAnyAuthority(authority1,authority2)

hasAnyRole(role1,role2)相似。

principal

取得当前登录的主体,并非boolean

authentication

取得当前认证对象,并非boolean

permitAll

总是返回true

denyAll

总是返回false

isAnonymous()

当前主体是否匿名用户

isRememberMe()

当前主体是否为“记住我”用户,没有完整认证的已认证用户

isAuthenticated()

当前主体是否为非匿名用户

isFullyAuthenticated()

当前主体是否既非匿名用户,也非“记住我”用户

hasPermission(Object target, Object

permission)

当前主体是否对target对象有permission访问权限。

hasPermission(Object targetId,

String targetType, Object

permission)

当前主体是否对标识为targetId,类型为targetType的对象由perssion访问权限。

 

备注:

1.角色名称默认情况下以ROLE_开头。这个前缀的值由DefaultWebSecurityExpressionHandler.类的defaultRolePrefix属性决定。

2.hasRole(role)中的role在使用Spring Security4时,可加ROLE_前缀,也可以不加前缀,不加时Spring Security将自动加上ROLE_前缀。hasAuthority(authority)也是类似的处理。 

3.Spring Security4中,hasRole()hasAuthority()其实是相同的含义。

它们都是SecurityExpressionRoot类中的方法,最终都调用了hasAnyAuthorityName()方法。

 

1.1.2. WEB表达式

Spring Security4提供了以下WEB专用表达式。

表达式

描述

hasIpAddress(ip/netmask)

客户端地址是否匹配参数中的IP地址和网络掩码

  

备注:

1.WEB专用表达式在WebSecurityExpressionRoot类中实现。参数中的ip是点分十进制的IP地址字符串,netmask是网络掩码,为一个十进制整数(132)

具体的匹配方式在IpAddressMatcher类中实现。基本思路就是将客户端IP地址和匹配参数中的IP地址都转化为4字节的数组。然后比较网络掩码中二进制位为1的比特位是否相同。完全相同则匹配成功,否则就是不匹配。

下面这个配置将只允许以ADMIN角色在本机访问/admin/下的URL127.0.0.1localhost不相同,localhost访问时有可能是IPV6下的地址,而不是127.0.0.1。在此配置中,IP地址以127开头的都是符合条件的IP地址。

 

<sec:intercept-url pattern="/admin/**" access="hasIpAddress(‘127.0.0.1/24‘) and hasRole(‘ROLE_ADMIN‘)" />

 

Spring Security应用开发(16)基于表达式的访问控制