权限思路及代码实现
2016-07-21 09:27
316 查看
权限管理思路 & 代码实现
权限思路:
页面原型:
!
图1
在页面中包含有用户名,密码,角色和验证码。角色是在访问登录页面的时候通过ajax去后台加载的数据。当点击登录的时候,表单将页面中的用户名,密码,角色id和验证码传入后台进行验证。
图2
图3
图4
图5
图6
图7
跳转逻辑:
当登录成功以后,在页面中会显示如图2,先点击用户管理 ,跳转到图3 ,然后进行角色分配,当角色分配好了以后,点击左侧的 角色管理 跳转到图4显示所有的角色,然后点击角色列表中的 菜单分配 跳转到图5进行分配菜单,分配完成后会返回到 角色列表 ,点击 分配模块 跳转到图7 ,可以在点击对应权限的复选框对模块进行授权。数据库表设计:
数据库设计如下图:图8
控制器及方法列表:
以下是各个Action中的方法列表:LoginAction:
login 验证登录
logout 用于安全退出
MenuAction:
findAll 查询所有菜单数据
findAllInRoleToJson 查询角色里面所有的菜单,用于登录成功后的左侧菜单,json
findAllOfDistributeToJson 查询所有菜单,用于角色里面的菜单分配,返回json
findAllOfDistribute 返回分配菜单的视图
RoleAction:
findAll 查询所有角色数据
findAllOfLoginToJson 查询所有的角色,返回json数据,用于登录时选取角色
findAllOfDistribute 查询所有角色,用于用户管理里面的角色分配
distributeMenu 分配菜单
distributeModule 分配模块
UsersAction:
findAll 查询所有用户数据
findAllRoleInUserToJson 查询对应用户里面的角色,用户分配角色是数据回显,json
distributeRole 分配角色
ModuleAction:
findAll 查询所有的模块信息
findAllOfDistribute 查询所有的模块,用于在角色管理里面分配模块
核心代码思路:
在授权完成后 过滤权限的时候,需要知道即将执行的action以及对象的方法是否有对应的权限,首先需要在登录成功以后去后台查询该用户所对应的所有的菜单列表和模块列表,菜单列表用于显示在左侧菜单里,而模块列表用于在访问的时候过滤请求的操作意图。在左侧菜单中显示的菜单就是分配好的菜单
在过滤请求里面的操作意图就是分配给角色的模块权限
过滤思路:
在系统中定义一个注解(Permissions)和枚举类(Permission)Permissions:
/** * 权限注解 用于方法和类上面 * @author Administrator * */ @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Permissions { Permission value() default Permission.NONE; }
Permission:
/** * 权限枚举类 * @author Administrator * */ public enum Permission { WITHOUT(-1), //不需要权限 NONE(0), //没有权限 QUERY(1), //查询权限 CREATE(2), //创建权限 UPDATE(4), //更新权限 DELETE(8); //删除权限 private int code; private Permission(int code){ this.code = code; } public int getCode(){ return this.code; } }
在使用的时候,将@Permissions注解用于Action类或是里面的方法,如果用于Action上,则表示在该Action中的没有被@Permissions注解所标注的方法有对应的权限,如果在方法上有该注解,这以该注解为准,比如:
@Permissions(Permission.QUERY) public class RoleAction{ public String findAll(){ return "findAll"; } @Permissions(Permission.UPDATE) public void updateRole(){ System.out.print("update"); } }
在以上代码中 表示findAll有查询权限,updateRole有更新权限。
在权限过滤的过程中,主要逻辑在PowerIntercepter中:对每一个请求进行拦截,需要获取当前执行的action,方法,然后根据该用户得到的所有权限进行比对,如果有 就通过,否则返回到无权限页面,首先根据Action去权限里面查询是否有对应的权限,如果有则根据该方法上面的注解和权限码进行计算,如果没有,则判断该方法上面是否有对应的忽略权限的标注,如果有直接通过,否则返回到没有权限的页面
配置文件
<package name="crm" namespace="/" extends="json-default"> <interceptors> <interceptor name="powerIntercepter" class="powerIntercepter"></interceptor> <interceptor-stack name="security"> <interceptor-ref name="powerIntercepter"></interceptor-ref> b4ee <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="security"></default-interceptor-ref> <global-results> <result name="error">/error.jsp</result> <result name="login">/login.jsp</result> <result name="logout" type="redirect">/login.jsp</result> <result name="main" type="redirect">/main/main.jsp</result> <result name="nopower">/common/nopower.jsp</result> </global-results> </package> <package name="default" namespace="/power" extends="crm"> <action name="loginAction" class="loginAction" method="login"></action> <action name="roleAction" class="roleAction" method="findAll"> <result name="findAll">/power/role/queryList.jsp</result> <result name="findAllOfDistribute">/power/users/distributeRole.jsp</result> <result name="distributeMenu" type="redirectAction">roleAction</result> <result name="findAllOfLoginToJson" type="json"> <param name="root">roles</param> </result> </action> <action name="usersAction" class="usersAction" method="findAll"> <result name="findAll">/power/users/queryList.jsp</result> <result name="distributeRole" type="redirectAction">usersAction</result> <result name="findAllRoleInUserToJson" type="json"> <param name="root">roles</param> </result> </action> <action name="menuAction" class="menuAction"> <result name="findAllOfDistribute">/power/role/distributeMenu.jsp</result> <result name="findAllOfDistributeToJson" type="json"> <param name="root">menuVos</param> </result> <!-- 登录成功后的左侧菜单 --> <result name="findAllInRoleToJson" type="json"> <param name="root">menuVos</param> </result> </action> <action name="moduleAction" class="moduleAction"> <result name="findAllOfDistribute">/power/role/distributeModule.jsp</result> </action> </package>
相关文章推荐
- 【DevOps】为什么我们永远疲于奔命?
- 网络管理之IP地址篇
- 文件的读出 编辑 管理
- PostgreSQL教程(十二):角色和权限管理介绍
- SQL Server 2008 R2 应用及多服务器管理
- VC下通过系统快照实现进程管理的方法
- jQuery技巧之让任何组件都支持类似DOM的事件管理
- 使用jQuery管理选择结果
- 使用C语言打造通讯录管理系统和教学安排系统的代码示例
- SQLServer 管理常用SQL语句
- 图书管理程序(二)
- javascript的内存管理详解
- 图书管理程序(三)
- 图书管理程序(一)
- Mysql权限管理grant命令使笔记
- 阿里云云服务器远程连接管理Linux服务器图文教程
- 解析PHP强制转换类型及远程管理插件的安全隐患
- Android获取设备隐私 忽略6.0权限管理
- Mongo管理用户相关操作总结
- MongoDB的基本安装与管理命令脚本总结