当前位置: 首页 > news >正文

使用拦截器实现权限管理

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    关于权限这一块,一直没去深入的研究过,只知道大概的过程,这一次借着新项目,重新把权限这一块了解了一下,以下是关于如何使用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

相关文章:

  • 没人研究tokumx吗?作为mongodb的追求者,来说两句。
  • storm acker机制
  • 4Sum -- LeetCode
  • Servlet访问postgresql数据库并提取数据显示在前端jsp页面
  • 如何解决HTML网页中文显示乱码的方法
  • Can't load IA 32-bit .dll on a AMD 64-bit platform
  • Jenkins中集成jmeter-maven插件
  • WebSocket 是什么原理?为什么可以实现持久连接
  • Flume传输数据事务分析
  • IPython4_Notebook
  • 安卓隐藏标题栏的不同方式
  • win7旗舰版安装office2007后打开文件提示找不到proplusww.msi
  • (04)odoo视图操作
  • 经典排序算法(Java实现)
  • 字符串,整型,长整型转换工具类
  • .pyc 想到的一些问题
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【附node操作实例】redis简明入门系列—字符串类型
  • js操作时间(持续更新)
  • rabbitmq延迟消息示例
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vagrant 添加本地 box 安装 laravel homestead
  • 电商搜索引擎的架构设计和性能优化
  • 解析带emoji和链接的聊天系统消息
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用Gradle第一次构建Java程序
  • 一起参Ember.js讨论、问答社区。
  • 如何在招聘中考核.NET架构师
  • #stm32整理(一)flash读写
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (TOJ2804)Even? Odd?
  • (第一天)包装对象、作用域、创建对象
  • (二)JAVA使用POI操作excel
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四) Graphivz 颜色选择
  • (小白学Java)Java简介和基本配置
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C#调用WebService 基础
  • (转)http协议
  • (转)菜鸟学数据库(三)——存储过程
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET业务框架的构建
  • @RestControllerAdvice异常统一处理类失效原因
  • [ 转载 ] SharePoint 资料
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [CF]Codeforces Round #551 (Div. 2)
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器