需求:,在進行登錄攔截賦予用戶權限時,需要賦予用戶多個角色權限,而在訪問地址攔截時訪問控制中當用戶擁有多個角色權限的任意其一,則可以訪問此頁面。
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="filterChainDefinitions">
<value>
<!-- 權限攔截 -->
/userRole/**=roles[admin,isShopMan]
<!-- 域名訪問,未登錄跳轉登陸頁面,已登陸根據角色跳轉對應主頁面 -->
/=examine
</value>
</property>
</bean>
當前登錄用戶擁有admin或者isShopMan兩種role中的任一個,則可以訪問/userRole/**的地址,而由於shiro配置filterchaindefinitions中的roles默認的判斷是&,也就是當角色同時是admin和isShopMan的時候,纔可以訪問此地址,所以如果在登錄的時候賦予用戶的角色權限是兩者的中的一個的時候,當訪問此頁面時無論如何都是沒有訪問權限的。。。
那麼,如何解決此問題呢?這裏就需要重寫過濾器用來繼承AuthorizationFilter了,將裏面的判斷方法改變,大致方法如下:
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
public class CustomRolesAuthorizationFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest req,ServletResponse resp, Object mappedValue) throws Exception {
Subject subject = getSubject(req, resp);
String[] rolesArray = (String[]) mappedValue;
if (rolesArray == null || rolesArray.length == 0) { //沒有角色限制,有權限訪問
return true;
}
for (int i = 0; i < rolesArray.length; i++) {
if (subject.hasRole(rolesArray[i])) { //若當前用戶是rolesArray中的任何一個,則有權限訪問
return true;
}
}
return false;
}
}
在這裏需要重寫AuthorizationFilter中的isAccessAllowed方法,使其對角色判斷變爲擁有其一則返回true。
然後在spring的配置文件中加入如下代碼:
<!--自定義的Roles Filter-->
lt;bean id="anyRoles" class="com.ssxt.ycfxf.host.filter.CustomRolesAuthorizationFilter" />
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="filterChainDefinitions">
<value>
<!-- 權限攔截 -->
/userRole/**=anyRoles[admin,isShopMan]
<!-- 域名訪問,未登錄跳轉登陸頁面,已登陸根據角色跳轉對應主頁面 -->
/=examine
</value>
</property>
</bean>
這裏使用自定義的anyRoles判斷攔截,則登錄綁定admin或者是isShopMan中的任意一個角色,則都可以進行攔截管理。則可以使用自定義的攔截器進行自定義攔截了。