使用拦截器实现权限管理
2016-01-25 11:44
591 查看
关于权限这一块,一直没去深入的研究过,只知道大概的过程,这一次借着新项目,重新把权限这一块了解了一下,以下是关于如何使用struts2中的拦截器实现用户权限的管理。
处理过程:
1. 初始化权限,在服务器启动的时候,将系统中所有的角色和功能查询出来,放入HashMap中,将来所有功能都在此进行判断。
2. 用户登录之后,将用户Id放入Session。
3. 拦截器拦截用户的每一次请求,先充Session中取出userId,如果没有UserId,则提示登录信息,有userId,则使用userId查询用户的角色,根据角色名称和当前请求的功能名称和list中的角色、功能信息进行对比,如果有当前功能,则有权限,没有则提示没有权限。
初始化权限: (在拦截器的init()方法中初始化)
登录成功后,将userId存入Session中:
拦截用户的每一次请求,对用户的权限进行判断:
处理过程:
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; }
相关文章推荐
- JS良好的编程习惯
- 关于51单片机IO引脚的驱动能力与上拉电阻
- 关于51单片机中的RAM、SFR和位地址的问题
- 用两片74HC138设计一个4-16译码器
- 重新敲一遍代码,胜过Ctrl+C和Ctrl+V
- 数学建模Word排版——样式
- has no public methods called onEvent
- AndroidStudio打包出现"xxx" is not translated in "zh" (Chinese) [MissingTranslation]
- typedef 的作用域
- Linux命令详解——vmstat
- Linux防火墙限制指定端口只能由指定IP访问
- Linux命令详解——vmstat
- Web APP开发技巧总结
- 指缝太粗 时光太瘦
- myeclipse 中 svn 更新 提交 同步资源库 详细解释下他们的功能
- 4×4 矩阵式键盘电路的改进
- 格雷码
- 利用“串口调试助手”等软件调试 PROTEUS 环境中 51单片机 的串行通信
- 哀悼同胞 舟曲不屈
- 利用单片机串口通信,使蜂鸣器发音