使用shiro时想在一个url上配置多个角色,就是说多个角色都可以访问这一个url
尝试了三种方法,全部失败:
- /see=roles[admin, teacher](此为正确的配置方式)
- /see=roles[admin], roles[teacher]
- /see=roles[admin] /see=roles[teacher]
下面说一下正确的方法
roles的默认filter为org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
public class RolesAuthorizationFilter extends AuthorizationFilter {
//TODO - complete JavaDoc
@SuppressWarnings({"unchecked"})
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);
//注意这里,使用的是hasAllRoles,就是说必须拥有所有的角色才能访问资源
return subject.hasAllRoles(roles);
}
}
接下来只需要修改roles的Filter就行了,只需要对RolesAuthorizationFilter修改一点就行了
public class MyRolesAuthorizationFilter extends AuthorizationFilter{
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
throws Exception {
Subject subject = getSubject(request, response);
//配置的访问所需角色
String[] rolesArray = (String[]) mappedValue;
if (rolesArray == null || rolesArray.length == 0) {
return true;
}
//需要修改的地方在这里,判断访问所需的角色是否包含当前用户的角色
List<String> roles = CollectionUtils.asList(rolesArray);
boolean[] bo = subject.hasRoles(roles);
//如果有一个角色满足,则可以访问
for(boolean b : bo){
if(b == true){
return true;
}
}
return false;
}
}
修改完filter之后,需要在shiro.ini文件中配置
[filters]
roles=com.xxx.xxx.MyRolesAuthorizationFilter
#这时候使用正确的配置方式就可以实现想要的功能了
[urls]
/see=roles[admin,teacher]
如果你也需要使用同样的功能,直接拷贝代码就行了。