使用拦截器实现权限管理

    关于权限这一块,一直没去深入的研究过,只知道大概的过程,这一次借着新项目,重新把权限这一块了解了一下,以下是关于如何使用struts2中的拦截器实现用户权限的管理。

    处理过程:

    1. 初始化权限,在服务器启动的时候,将系统中所有的角色和功能查询出来,放入HashMap中,将来所有功能都在此进行判断。

    2. 用户登录之后,将用户Id放入Session。

    3. 拦截器拦截用户的每一次请求,先充Session中取出userId,如果没有UserId,则提示登录信息,有userId,则使用userId查询用户的角色,根据角色名称和当前请求的功能名称和list中的角色、功能信息进行对比,如果有当前功能,则有权限,没有则提示没有权限。


初始化权限: (在拦截器的init()方法中初始化)

public void init() {
		// TODO Auto-generated method stub
		System.out.println("AuthorityInterceptor-----------------   init()");
		
		// 初始化权限
		String selectRoleIdOK = db.selectRoleId().toString();
		System.out.println(selectRoleIdOK);
		if(responseutil.getResultData(selectRoleIdOK).equals("OK")){
			
			String roleId = responseutil.JSONResolveArray(responseutil.getRowsData(selectRoleIdOK), ",");
			
			System.out.println("roleId:"+roleId);

			String[] roleIdArr = roleId.split(",");
			
			for (int i = 0; i < roleIdArr.length; i++) {
				System.out.println(roleIdArr[i]);
				String selectFunctionNameOK = db.selectFunctionName(roleIdArr[i]).toString();
				System.out.println(selectFunctionNameOK);
				String roleName = responseutil.JSONResolveArray(responseutil.getRowsData(selectFunctionNameOK), ",");
				Object[] obj = roleName.split(",");
				authorityMap.put(roleIdArr[i], obj);
			}
			
		}else {
			System.out.println(selectRoleIdOK);
		}
		
	}

登录成功后,将userId存入Session中:

// 将用户id保存在Session中
ActionContext.getContext().getSession().put("userId", userId);

拦截用户的每一次请求,对用户的权限进行判断:

public String intercept(ActionInvocation invocation) throws Exception {

		/**
		 * 从Session中检查是否有userId,没有则提示登录,有userId,则使用UserId查询用户的角色,根据角色名称和当前请求的功能名称和list中的
		 * 角色、功能信息进行对比,如果有当前功能,则有权限,没有则提示没有权限
		 */
		
		// 返回的信息
		JSONObject result = new JSONObject();
		
		String intercepter = null;
		
		String userId = (String) ActionContext.getContext().getSession().get("userId");
		
		if ("".equals(userId) || null == userId) {
			System.out.println("没有登录");
			result.put("result", "请登录!");
			
			responseutil.authResponseData(result.toString());

		}else {
			System.out.println("已经登录");
			// 已经登录,使用userId查询用户角色
			String getRoleOK = db.getRole(userId).toString();
			if(responseutil.getResultData(getRoleOK).equals("OK")){
				
				String roleId = responseutil.JSONResolveArray(responseutil.getRowsData(getRoleOK), "");
				
				System.out.println("roleId:"+roleId);
				
				String functionName = invocation.getProxy().getActionName();
				
				// 使用角色id和功能名称检查用户是否有次权限
				boolean res = authorityJudge(authorityMap, functionName, roleId);
				if (res) {
					System.out.println("有权限了--------------");
					intercepter = invocation.invoke();
				}else {
					System.out.println("没有权限****************");
					
					result.put("result", "无此权限!");
					
					responseutil.authResponseData(result.toString());
					
				}
			}else {
				System.out.println(getRoleOK);
				result.put("result", "获取角色失败!");
				
				responseutil.authResponseData(result.toString());
			}
		}
		
		return intercepter;
	}
	
	// 使用角色id和功能名称检查用户是否有次权限
	public static boolean authorityJudge(Map<String,Object> authorityMap, String functionName, String roleId){

		boolean authorityMake = false;
		
		Object[] obj=(Object[]) authorityMap.get(roleId);
		// 遍历对比是否有权限
		for (int i = 0; i < obj.length; i++) {
			System.out.println(obj[i]);
			
			if (functionName.equals(obj[i])) {
				System.out.println("有权限");
				authorityMake = true;
				break;
			}else {
				System.out.println("没有权限");
			}

		}
		
		return authorityMake;
	}



转载于:https://my.oschina.net/hehongbo/blog/608828

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值