}catch (Exception e) { throw new RuntimeException(); } } 上面的代码就实现模块与功能树的xml 那么,在浏览器端怎么才能得到选定功能的组合呢?还是要回到js function getSelectedLeaf(){ var arry=simpleHtmlTree3.getChecked();//获得选定节点的组合
var idset=""; var nd; for(var i=0;i<arry.length;i++){ nd=arry[i]; //alert(nd.type); if(nd.type=="L"){//把叶子节点留下,叶子节点对应为功能 idset+=""+nd.id+","; } } idset=idset.substr(0,idset.length-1); alert(idset); document.forms["operationForm"].elements["pageList"].value=idset;//这样就得到了选定功能的组合 } 最后,要把选定功能集合的每个功能与角色对应保存在“角色&功能对应表”,这个我就不用说了吧。 到此为止,大家看明白了么?不明白可以问我,呵呵
这就需要对不同登录用户进行判断。
比如:客户关系管理系统,客户资料维护功能,有如下需求:
1,该客户是登录用户开发的,则显示“修改”“删除”按钮;
2,否则不予显示。这个没有办法使用角色授权策略进行控制。
一般情况下,大多采用硬编码模式:
if( 该客户是登录用户开发的 ) {
显示“修改”“删除”按钮;
} 这样有个缺点:权限判断代码分散在各个业务代码里面,当需求发生变化的时候,不好办。
比如上述功能增加一条需求:如果当前登录用户是高级客户经理,显示“修改”按钮,不显示“删除”按钮。所以,最好的办法是:将这些权限判断代码分离出去。
if( YourSecurityService.permit( 修改客户操作, 该客户, 登录用户 ) ) {
显示修改按钮;
}
if( YourSecurityService.permit( 删除客户操作, 该客户, 登录用户 ) ) {
显示删除按钮;
}
OK!我给出代码,供参考讨论。
先说说硬编码模式的样子:(硬编码不好,如果对各个用户进行硬编码更是不对了。如果系统有10w个用户怎么办,岂不累死!\\\)// 判断当前客户是否为登录用户开发的
if( currentCustomer.getManager().equals( loginUser.getId() ) {
out.println( "<input type='button' value='修改'/>" );
}
这样当然不好。因为判断条件可能会发生变化。改进!! 将权限判断抽取出去。
public interface YourSecurityService {
public boolean permit( int privilegeId, Customer customer, User loginUser );
}界面代码将转换为:
if( YourSecurityService.permit( Constants.UPDATE_CUSTOMER, currentCustomer, loginUser ) ) {
out.println( "<input type='button' value='修改'/>" );
}这样权限判断从业务中脱离了。当然业务代码里面还需要咨询YourSecurityService,获取权限判断结果。
不知道我说明白没有,。
Permission
Role
User
Role_Permissions
User_Roles
User_Permissions
后台方法一般采用 Annotation 来进行权限的标注。不会把权限嵌到
代码中的去的,有些框架自身就带有这个功能,比如 Seam。如果框架不带这种功能的话,需要生成代理类自行处理 Annotation 中的标注,
以确定该方法是否运行。如果是页面上的权限需要采用判断了,如果使用 JSF 页面的话,更为方便,
可以使用 JSF 的 rendered 属性来控制是否呈现。
我用J2EE和ASP.NET都实现过权限管理好像并不复杂啊
弄清楚关系不难下手吧
这种小权限的问题用if判断
不过你要在后台进行控制
确实需要基于角色权限的管理
可以看下RBAC0
那就是通过若干个xml文件去对应相应权限的treeview
这样,相应权限也只能调用相应的xml数据源,可实现显示不同的菜单和界面.JAVA也可以利用这种思想
至于权限的管理,就如同上面说的,通过几个表及之间的对应关系就可以做到了
http://www.metadmin.com/tech/category.html以及这个FLASH演示:http://www.metadmin.com/download/showEmployees.html
如果用户可以自定义角色分配的话那就要看RBAC了,http://baike.baidu.com/view/73432.htm
id 权限名
1 修改报表金额
2 导出报表
3
角色表
1 经理
2 文员
3 助理权限组
id 角色id 权限id
1 经理id 修改金额
2 经理id 导出报表
3 经理id 炒鱿鱼
4 文员id 打印报表
5 助理id 导出报表
一个角色等于 拥有一组权限而不是一个权限,权限是单个的对象,可以任意组合至某个权限组,判断有无权限,检查角色即可。
先用list显示出所有的用户id,name,以及对其所拥有的权限的描述!!!!!!!!!!!!!!!!
页面设置编辑按钮和删除按钮,跳转到编辑页面后选择该用户可以拥有的权限,存到数据库中;
然后保存,显示出来!
其中有许多细节的好好思考!!!!
可以给你介绍一个例子
客户信息管理系统(CRM)
三张实体表
Web_Authorize(权限)
aut_id 自动编号
aut_name 权限名称Web_Group(组)
gro_id 自动编号
gro_name 组名称Admin(管理员账号)
admin_id 自动编号
admin_name 名称
admin_pass 密码二张映射表
Web_Authorize_Group(权限对组-多对多关系)
ag_id 自动编号
aut_id 映射到Web_Authorize表
gro_id 映射到Web_Group表Web_Group_Admin(组对管理员-多对多关系)
ga_id 自动编号
gro_id 映射到Web_Group
admin_id 映射到Admin
Web_Authorize
aut_id aut_name
1 文章添加
2 文章列表
3 文章删除
4 栏目添加
5 栏目列表
6 栏目删除Web_Group
gro_id gro_name
1 超级管理员
2 文章管理员
3 栏目管理员Admin
admin_id admin_name admin_pass
1 admin admin
2 article article
3 category category
4 you 123Web_Authorize_Group(权限对组-多对多关系)
ag_id aut_id gro_id
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
7 1 2
8 2 2
9 3 2
10 4 3
11 5 3
12 6 3Web_Group_Admin(组对管理员-多对多关系)
ga_id gro_id admin_id
1 1 1
2 2 2
3 3 3
4 2 4
5 3 4假如现在我们来判断article账号是否有栏目添加(aut_id=4)权限
admin_id = 2
先查询Web_Group_Admin表里的admin_id=2得到gro_id=2,然后再到Web_Authorize_Group表中查询gro_id=2 and aut_id=4(栏目添加的权限),如果有数据返回true表示有该权限
,这里gro_id=2数据是
1 文章添加
2 文章列表
3 文章删除
显然它是没有栏目添加权限的
2. 没门 干脆就让没权限的人看不到进去的方式
三张实体表
Web_Authorize(权限)
aut_id 自动编号
aut_name 权限名称 Web_Group(组)
gro_id 自动编号
gro_name 组名称 Admin(管理员账号)
admin_id 自动编号
admin_name 名称
admin_pass 密码 二张映射表
Web_Authorize_Group(权限对组-多对多关系)
ag_id 自动编号
aut_id 映射到Web_Authorize表
gro_id 映射到Web_Group表 Web_Group_Admin(组对管理员-多对多关系)
ga_id 自动编号
gro_id 映射到Web_Group
admin_id 映射到Admin
Web_Authorize
aut_id aut_name
1 文章添加
2 文章列表
3 文章删除
4 栏目添加
5 栏目列表
6 栏目删除 Web_Group
gro_id gro_name
1 超级管理员
2 文章管理员
3 栏目管理员 Admin
admin_id admin_name admin_pass
1 admin admin
2 article article
3 category category
4 you 123 Web_Authorize_Group(权限对组-多对多关系)
ag_id aut_id gro_id
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
7 1 2
8 2 2
9 3 2
10 4 3
11 5 3
12 6 3 Web_Group_Admin(组对管理员-多对多关系)
ga_id gro_id admin_id
1 1 1
2 2 2
3 3 3
4 2 4
5 3 4 假如现在我们来判断article账号是否有栏目添加(aut_id=4)权限
admin_id = 2
先查询Web_Group_Admin表里的admin_id=2得到gro_id=2,然后再到Web_Authorize_Group表中查询gro_id=2 and aut_id=4(栏目添加的权限),如果有数据返回true表示有该权限
,这里gro_id=2数据是
1 文章添加
2 文章列表
3 文章删除
显然它是没有栏目添加权限的
说的没错,那么我来说说具体的操作方案。第一,建立模块表
第二,建立功能表说明一下,为什么要把模块和功能分开?拿前面一个老兄的例子来说,1 文章添加
2 文章列表
3 文章删除
4 栏目添加
5 栏目列表
6 栏目删除 上面这些功能当中,1,2,3是属于文章模块的,而后三个属于栏目模块的,这样不至于把不同类型的功能都放在了一个层次当中,模块之间有隶属关系,有大模块,小模块,而功能是隶属于模块的,那么这样最终就会形成一颗树型结构,对于菜单也是一个树形菜单,您可以接着往后看,有实现的代码。第三,建立角色表第四,建立角色&功能对应表,这就是楼主要的分配权限下面我开始讲关键实现的思路代码:模块的维护不必说了,就类似与文件夹套文件夹,而功能相当于文件夹中的文件,这也不必说了那么如何给某一个角色分配权限呢?下面给出实现代码,首先让所有的模块和功能以树形目录的方式展现在界面中,而且还要让每个节点都有一个checkbox,当你选择了某写功能后,这些选定的功能将以id1,id2,...,id3形式的字符串进行组合,服务器端程序取得这个字符串以后,把字符串split,把每个id与角色的对应依次保存在“角色&功能对应表”中。
下面的js脚本用于产生模块和功能的含checkbox的树,这个东西simplehtmltree3.8,在资源里下载
simpleHtmlTree3= new SimpleHtmlTree("treepanel1","<%=path%>/jsWidget/simplehtmltree/images/mn/","<%=path%>/jsWidget/simplehtmltree/images/style0/","2");
var root=simpleHtmlTree3.createTreeNode("root","默认模块","D","","","",selectRoot);
simpleHtmlTree3.add(root);
simpleHtmlTree3.loadXmlFromFile("<%=path%>/action/getAllModuleNPageAction.action?parentModuleId=",true,root,selectModule,appendChildNodes,false);
树对应的数据是从哪来的呢?仔细看的话会发现从getAllModuleNPageAction.action中来
所以需要给出getAllModuleNPageAction.action的关键代码,说明下,下面代码中的page一词就表示功能。
private void getModulesNPages(String parentModuleId){
try{
int i,listSize;
List<Module> list=null;
Module listItem;
list=moduleService.findSingleLevelModulesByParentId(parentModuleId);
if(list!=null){
listSize=list.size();
for(i=0;i<listSize;i++){
//System.out.println(list.get(i).getModuleId());
listItem=list.get(i);
xmlModulesNPages+="<node";
xmlModulesNPages+=" id='"+listItem.getModuleId()+"'";
xmlModulesNPages+=" text='"+listItem.getTitle()+"'";
xmlModulesNPages+=" type='D'>";
getModulesNPages(listItem.getModuleId());
xmlModulesNPages+="</node>";
}
}
List <Page> pageList0;
pageList0=pageService.findPagesByModuleId(parentModuleId); //递归
if(pageList0!=null){
for(i=0;i<pageList0.size();i++){
System.out.println("page :"+pageList0.get(i).getTitle());
xmlModulesNPages+="<node";
xmlModulesNPages+=" id='"+pageList0.get(i).getPageId()+"'";
xmlModulesNPages+=" text='"+pageList0.get(i).getTitle()+"'";
xmlModulesNPages+=" type='L'";
xmlModulesNPages+="></node>";
}
}
}catch (Exception e) {
throw new RuntimeException();
}
}
上面的代码就实现模块与功能树的xml
那么,在浏览器端怎么才能得到选定功能的组合呢?还是要回到js
function getSelectedLeaf(){
var arry=simpleHtmlTree3.getChecked();//获得选定节点的组合
var idset="";
var nd;
for(var i=0;i<arry.length;i++){
nd=arry[i];
//alert(nd.type);
if(nd.type=="L"){//把叶子节点留下,叶子节点对应为功能
idset+=""+nd.id+",";
}
}
idset=idset.substr(0,idset.length-1);
alert(idset);
document.forms["operationForm"].elements["pageList"].value=idset;//这样就得到了选定功能的组合
}
最后,要把选定功能集合的每个功能与角色对应保存在“角色&功能对应表”,这个我就不用说了吧。
到此为止,大家看明白了么?不明白可以问我,呵呵
tom的权限是1110,那么表示他对用用户只具有查询的权限。