为什么自定义Shiro的拦截器
Shiro自带的拦截器,一个请求只能赋予一个角色或者一个组合角色。
例如:
filterChainDefinitionMap.put("/user/*","roles[user,admin]"); 表示只有同时获得user和admin的角色才能访问/user/*
但是实际中,需要/user/* 的请求user和admin角色都可以访问,那么就需要自定义拦截器
怎么自定义Shiro的拦截器
默认的拦截器
所有的拦截器都继承了AccessControlFilter类
继承了AccessControlFilter类的拦截器有下图中的几种:
默认使用的拦截器是:RolesAuthorizationFilter
在默认的拦截器中,roles[user,admin] 表示user加上admin的组合角色
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
Subject subject = getSubject(request, response);
String[] rolesArray = (String[]) mappedValue;
if (rolesArray == null || rolesArray.length == 0) {
//no roles specified, so nothing to check - allow access.
return true;
}
Set<String> roles = CollectionUtils.asSet(rolesArray); //将所有的权限加起来的组合权限
return subject.hasAllRoles(roles);
}
CollectionUtils.asSet()方法
public