细颗粒权限控制

具体方法是在action中的访问方法上加上自定义注解,在拦截器中,根据用户角色是否具有自定义注解中指定的权限,来选择向用户呈现的内容。

注解类实现:

package com.hurricane.shop.util;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;


/**
 * 自定义注解
 */
//被这个注解修饰的注解,利用反射,将其他的注解读取出来
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationLimit {
	String mid();  //子模块模块名称
	String pid(); //父模块操作名称
}

拦截器中判断的相关代码:

			HttpServletRequest request = (HttpServletRequest) actioninvocation
					.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
			//获取请求的action对象
			Object action = actioninvocation.getAction();
			//获取请求的方法的名称
			String methodName = actioninvocation.getProxy().getMethod();
			//获取action中的方法的封装类(action中的方法没有参数)
			Method method = action.getClass().getMethod(methodName, null);

			String result = null; // Action的返回值   
			//在完成跳转Action之前完成细颗粒权限控制,控制Action的每个方法
			//检查注解,是否可以操作权限的URL
			boolean flag = isCheckLimit(request,method);
			if(flag){
				// 运行被拦截的Action,期间如果发生异常会被catch住   
				result = actioninvocation.invoke();
			}
			else{
				request.setAttribute("errorMsg", "对不起!您没有权限操作此功能!");
				return "errorMsg";
			}
			return result;

/**验证细颗粒权限控制*/
	public boolean isCheckLimit(HttpServletRequest request, Method method) {
		if(method==null){
			return false;
		}
		//获取当前的登陆用户
		ElecUser elecUser = (ElecUser)request.getSession().getAttribute("globle_user");
		if(elecUser==null){
			return false;
		}
		
		//获取当前登陆用户的角色(一个用户可以对应多个角色)
		Hashtable<String, String> ht = (Hashtable)request.getSession().getAttribute("globle_role");
		if(ht==null){
			return false;
		}
		//处理注解,判断方法上是否存在注解(注解的名称为:AnnotationLimit)
		/*
		 * 例如:
		 * 	@AnnotationLimit(mid="aa",pid="0")
	        public String home(){
		 */
		boolean isAnnotationPresent= method.isAnnotationPresent(AnnotationLimit.class);
		
		//不存在注解(此时不能操作该方法)
		if(!isAnnotationPresent){
			return false;
		}
		
		//存在注解(调用注解)
		AnnotationLimit limit = method.getAnnotation(AnnotationLimit.class);
		
		//获取注解上的值
		String mid=limit.mid();  //权限子模块名称
		String pid=limit.pid();  //权限父操作名称
		
		/**
		 * 如果登陆用户的角色id+注解上的@AnnotationLimit(mid="aa",pid="0")
		 *   * 在elec_role_popedom表中存在   flag=true,此时可以访问Action的方法;
		 *   * 在elec_role_popedom表中不存在 flag=false,此时不能访问Action的方法;
		 */
		boolean flag=false;
		//拦截器中加载spring容器,从而获取Service类,使用Service类查询对应的用户信息
		WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
		IElecRoleService elecRoleService = (IElecRoleService)wac.getBean(IElecRoleService.SERVICE_NAME);
		//查询elec_role_popedom表中的所有的数据,使用二级缓存,解决系统性能问题
		List<ElecRolePopedom> list = elecRoleService.findAllRolePopedomWithCache();
		if(list!=null&&list.size()>0){
			for(int i=0;i<list.size();i++){
				ElecRolePopedom elecRolePopedom = list.get(i);
				if(elecRolePopedom!=null){
					if(ht!=null && ht.size()>0){
						for(Iterator<Entry<String, String>> ite = ht.entrySet().iterator();ite.hasNext();){
							Entry<String, String> entry = ite.next();
							//获取角色ID
							String roleID = entry.getKey();
							if(roleID.equals(elecRolePopedom.getRoleID()) && mid.equals(elecRolePopedom.getMid())
									   && pid.equals(elecRolePopedom.getPid())){
								//flag=true:表示有权限操作该功能
								flag=true;
								break;
							}
						}
					}
				}
			}
		}
		return flag;
	}


PS.以上引用代码不是本人原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值