首先统一模块名、方法名、命名空间。确定树节点中的模块名与管理的模块名保持一致。例如t_menunode与t_module中的url相同。
Uml类图:
c) url:org!updateOrg
要做权限,首先弄清表结构。
对于实现如何登陆确定权限:
前提:创建单独类AuthInfo,用于存放用户所用的权限。类中字段有url、operator(对模块的操作码)、priority(优先级)
1、 登陆时查询目前登陆用户所拥有的所有的User_Role(中间表),遍历这些User_Role,每遍历一次得到一个角色,角色可以对多个模块操作,且与模块式多对多关系,可以得到中间表AccessControlList集合,再遍历每个AccessControlList,然后将信息放入AuthInfo中。然后依次放入一个Map中key为url(如role、module),value为AuthInfo。
代码如下:
Set<AccessControlList>accessControlLists = role.getAccessControlLists();
for (Iterator iterator2 = accessControlLists.iterator();iterator2
.hasNext();) {
AccessControlList acl = (AccessControlList) iterator2
.next();
AuthInfo authInfo = new AuthInfo();
authInfo.setUrl(acl.getModule().getUrl());
authInfo.setOperator(acl.getOperatorCode());
authInfo.setPriority(userRole.getPriority());
AuthInfo authInfo2 = (AuthInfo) auth.get(acl.getModule().getUrl());
if(authInfo2!=null){
if(authInfo.getPriority()<authInfo2.getPriority()){
auth.put(authInfo.getUrl(),authInfo);
}
}else{
auth.put(authInfo.getUrl(),authInfo);
}
System.out.println();
}
注意:有可能一个用户拥有多个角色,其中有两个角色对同一模块都有操作权限,此时需要比较优先级。
2、 上面的是通过角色查询拥有的操作权限,还有可能是直接授权,越过了角色,通常情况下我们认为直接授权的优先级最高,此时直接
Set<AccessControlList>accessControlLists = user.getAccessControlLists();
for (Iterator iterator =accessControlLists.iterator();
3、 不在是通过角色得到accessControlLists对象,现在遍历这个便可得到用户直接授权,在将其放入AuthInfo中。然后依次放入一个Map中key为url(如role、module),value为AuthInfo。
4、 在登陆时完成以上操作后,将上边获取的Map放入session中,以便后来使用。
5、 在生成节点树的时候,首先获取全部的节点List,然后遍历。在遍历时取出url,以org为例,取出的父节点的url为org,对于的子节点为
c) url:org!updateOrg
e) 这样,分开处理这两中情况,若为父节点,通过此url(Map中的key)得到对应的AuthInfo,若AuthInfo为空,说明此用户对此模块无权限操作,若不为空,将这个节点放入新的NewList。如果我子节点,此时的url为org!updateOrg这种类型,将此地址split,得到的String数组的第一个就为moduleName,后面为方法名,通过得到的moduleName做为Key,在session中的Map得到对应的AuthInfo,若为空,无权限,跳过。不为空,则许CRUD分别判断。将AuthInfo中的操作码与CREATE、RETRIVE、UPDATE、DELETE分别与操作,若得到的值不为空则分别有权限操作这些节点,就放入新的NewList。最后将NewList返回生成树。
List list = new ArrayList<MenuNode>();
if (pid==-1) {
list = this.hibBaseDao.getRowsFileds("fromMenuNode m where m.parent.id is null ", null );
}else{
list = this.hibBaseDao.getRowsFileds("fromMenuNode m where m.parent.id=?",new Object[]{pid});
}
Map auth = AuthInfo.getAuth();
List nlist = new ArrayList();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
MenuNode menuNode = (MenuNode) iterator.next();
String url = menuNode.getUrl();
if(menuNode.getLeaf()==0){
AuthInfo authInfo = (AuthInfo) auth.get(url);
if(authInfo!=null){
nlist.add(menuNode);
}
}else{
String[] actionMethod = url.split("!|/");
String actionName = actionMethod[0];
String methodName = actionMethod[1];
AuthInfo authInfo = (AuthInfo) auth.get(actionName);
if(authInfo!=null){
if (methodName.contains("add")) {
if ((Operator.CREATE&authInfo.getOperator())!=0) {
nlist.add(menuNode);
}
}else if(methodName.contains("delete")){
if ((Operator.DELETE&authInfo.getOperator())!=0) {
nlist.add(menuNode);
}
}else if(methodName.contains("update")){
if ((Operator.UPDATE&authInfo.getOperator())!=0) {
nlist.add(menuNode);
}
}else{
if ((Operator.RETRIVE&authInfo.getOperator())!=0) {
nlist.add(menuNode);
}
}
}
}
}
return nlist;
}
这样,权限树就生成了。
对于给角色授权,这些就是向对应的表中插入对应的值。此处说一下角色授权
角色授权就是给角色授予CRUD的某种操作。因为这个是需要三张表的,首先Role(角色)、AccessControlList(中间表)、Module(模块表),
此时要做的就是向AccessControlList表中插入对应数据,然后就行了。