您的位置:首页 > 编程语言

权限思路及代码实现

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  管理 权限管理