首页 > 代码库 > 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是网络掩码,为一个十进制整数(1到32)。
具体的匹配方式在IpAddressMatcher类中实现。基本思路就是将客户端IP地址和匹配参数中的IP地址都转化为4字节的数组。然后比较网络掩码中二进制位为1的比特位是否相同。完全相同则匹配成功,否则就是不匹配。
下面这个配置将只允许以ADMIN角色在本机访问/admin/下的URL,127.0.0.1和localhost不相同,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)基于表达式的访问控制