`
dongjun316
  • 浏览: 31898 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

权限系统设计(菜单)

阅读更多
B/S系统菜单和用户角色绑定。
先上数据库表结构:
用户表 T_USER(USERID NUMBER,NAME VARCHAR2(63),PWD VARCHAR2(127))
角色表 T_ROLE(ROLEID NUMBER,NAME VARCHAR2(63))
用户角色关系表 T_USER_ROLE(USERID NUMBER,ROLEID NUMBER)
菜单表 T_MENU(MENUID NUMBER,MENUNAME VARCHAR2(30),URL VARCHAR2(128),MODULE VARCHAR2(50),PERMISSION INT)
角色菜单关系表 T_ROLE_MENU(MENUID NUMBER,ROLEID NUMBER)

struts2 Action配置
<action name="*/*" method="{2}" class="{1}Action">
<result name="input">/view/{1}/{1}_%{preAction}.jsp</result>
<result name="insert">/view/{1}/{1}_{2}.jsp</result>
...
</action>

其实他们之间的关系简单说就是:用户和角色多对多,角色和菜单多对多。
先说下系统URL组织方式/sys/module/crud.jspx,即一个功能一个module,比如用户管理/sys/user/list.jspx,/sys/user/insert.jspx 。。。。。
URL中的module对应T_MENU表中的module字段,Permission字段对应的list,insert等对应的标示码。我的标示规则是 list - 1,insert - 2,edit - 4,save - 8,delete - 16以此类推。
SELECT MODULE,SUM(PERMISSION) AS PM FROM T_MENU INNER JOIN....就可以列表出用户各个模块的总权限,将此列表存放于用户Session中(以Map方式存放方便检索)。
接下来说怎么将上面那些结合起来:
1、首先写一个ContextLoadListner用来初始化标示规则,我用的是Xml。
<Permissions>
<Permission canIgnore="false">
   <Name>list</Name><Value>1</Value>
</Permission>
<Permission canIgnore="true">
   <Name>select</Name><Value>256</Value>
</Permission>
<Permissions>

canIgnore标示该动作是否可以忽略权限判断,比如有的页面需要弹出一个窗口来选择部门(/sys/depart/select.jspx)这个时候select是不经过权限判断的。
初始化完成后Map<String,Permission>放到ApplicationContext里。
2、写一个拦截器(我的是Struts2)
   首先取URL中的Action,用此Action到Context的Map<String,Permission>中查找Permission 对象,
permission = definition.get(action);
if(permission.canIgnore())
  return true;
else{
   Integer modulePermission = session中的.get(module);
   return permission.getValue() & modulePermission > 0;
}
2
0
分享到:
评论
1 楼 ding43930053 2014-01-03  
能否附上详细的代码

相关推荐

Global site tag (gtag.js) - Google Analytics