1. 程式人生 > >Spring Security應用開發(16)基於表達式的訪問控制

Spring Security應用開發(16)基於表達式的訪問控制

member font pan 地址 使用 基於 spa 數組 express

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