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
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)基於表達式的訪問控制