使用Apache shiro进行权限管理时如何对同一个URL配置多个角色的或关系

        在开发web应用时,通常会对一个用户分配某个角色。该角色拥有一定的权限,那么需要进行

权限管理。在进行权限管理的时候,常常会遇到不同角色的用户访问相同URL的情况。如果只有部

分角色访问该URL,那么需要限制只有这些角色才可以访问该URL。

        在这种情况下,涉及的是角色之间的或关系的管理。因为一般情况下,一个用户通常只有一个

角色。shiro的过滤中有个RolesAuthorizationFilter过滤器,对应的过滤器名为roles。当配置如

roles["admin,test"]时,表示的是当前用户角色必须既是admin,也是test。也就是说该过滤器的角色

控制是且的关系。若要实现或的关系,可以自己实现一个过滤器,实现或逻辑。


        实现方式很简单,实现AuthorizationFilter类就行了。实现如下

<span style="font-size:14px;">import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

// AuthorizationFilter抽象类事项了javax.servlet.Filter接口,它是个过滤器。
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;
	}
}</span>

        通过Spring框架将该过滤器添加到shiro权限管理中

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
				    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
		default-lazy-init="true">

	<!-- Shiro Filter -->  
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" depends-on="roleOrFilter">  
	    <!-- 添加各种验证过滤器 -->
	    <property name="filters">
	    	<map>
	    	    <entry key="roleOrFilter" value-ref="roleOrFilter"/>
	    	</map>
	    </property>
	    <!-- 添加对各种请求执行的过滤操作 -->
	    <property name="filterChainDefinitions">  
	        <value>
	        	<!-- 当前用户的角色必须是comm或test才有权限执行该URL请求 -->
	            /user!query.action = authc,roleOrFilter["comm,test"]
	        </value>  
	    </property>  
	</bean>
	
	<!-- 自定义的过滤器,用来判断当前用户是否是roleOrFilter["comm,test"]中的某个角色 -->
	<bean id="roleOrFilter" class="com.test.shiro.CustomRolesAuthorizationFilter" />
</beans></span>

        此时当当前用户的角色为comm或test时,有权访问/user!query.action,若既不是comm,也不是

test,则无权访问/user!query.action。





  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值