我想做一个网站的后台 有权限管理系统
一个叫admin 可以分配权限
不同的权限可以看到不同的菜单操作我就是想问问 j2ee web 用了实现这个功能的应该怎么做啊
不同权限的用户看到不同的menu 我不想针对每个权限都有不同的界面
用什么方案啊

解决方案 »

  1.   

    正在学习WebService,支持一下!我手上也正好有此项目的需求,学习学习!
      

  2.   

    风讯的做法是把权限分配一个对应的字符,再用instr进行包含判断不过这种做法对于大型项目不知道是否实用
      

  3.   

    把权限放到SESSION中 给没权限的人看到他没权限的操作 具体判断到控制层去做 如果没权限的话则提示该用户没有权限进行接下来的操作
      

  4.   

    这和WebService有什么关系?一点都没有!
      

  5.   

    不同的权限显示不同的菜单又不想多个页面的话,可以借助struts  的判断标签,或者jstl 中的判断标签
      

  6.   

    这个 你可以把菜单放在数据库里,admin可以设置每个登陆人的一个角色,这样不用的人有不同角色,然后根据这个角色为条件 取出菜单。我们的项目是这样做的,大家可以讨论下
      

  7.   


    这就需要对不同登录用户进行判断。
    比如:客户关系管理系统,客户资料维护功能,有如下需求:
    1,该客户是登录用户开发的,则显示“修改”“删除”按钮;
    2,否则不予显示。这个没有办法使用角色授权策略进行控制。
    一般情况下,大多采用硬编码模式:
    if( 该客户是登录用户开发的 ) {
       显示“修改”“删除”按钮;
    } 这样有个缺点:权限判断代码分散在各个业务代码里面,当需求发生变化的时候,不好办。
    比如上述功能增加一条需求:如果当前登录用户是高级客户经理,显示“修改”按钮,不显示“删除”按钮。所以,最好的办法是:将这些权限判断代码分离出去。
    if( YourSecurityService.permit( 修改客户操作, 该客户, 登录用户 ) ) {
       显示修改按钮;
    }
    if( YourSecurityService.permit( 删除客户操作, 该客户, 登录用户 ) ) {
       显示删除按钮;
    }
      

  8.   

    你这种方式感觉不是很好,如果用户多了怎么办,比如A、B、C...N个用户其中有8个可以增加不能删除,有5个可以删除,不能增加,有2个即可增加也可以删除怎么判断?而且这么写也把程序给写死了,需求一变就得改,不灵活。而且当涉及的小权限过多的时候也不好控制,比如页面上有多个按钮,多个超链接,这些都是需要控制小权限的怎么弄?这样写岂不是页面代码超长?谁有好办法,能够系统的去管理维护这些小权限?
      

  9.   


    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,获取权限判断结果。
    不知道我说明白没有,。
      

  10.   

    至少有以下六张表:
    Permission
    Role
    User
    Role_Permissions
    User_Roles
    User_Permissions
      

  11.   

    每一个功能的权限代码无论是在前台页面和后台方法都要写在上面的,
    后台方法一般采用 Annotation 来进行权限的标注。不会把权限嵌到
    代码中的去的,有些框架自身就带有这个功能,比如 Seam。如果框架不带这种功能的话,需要生成代理类自行处理 Annotation 中的标注,
    以确定该方法是否运行。如果是页面上的权限需要采用判断了,如果使用 JSF 页面的话,更为方便,
    可以使用 JSF 的 rendered 属性来控制是否呈现。
      

  12.   

    对于功能上的鉴权  只要数据库设计得合理就可以了  主要还是 用户 角色  操作  RBAC框架     其实最难的是数据鉴权 这个就比较活了  而且做到无侵入性 更是难上加难  现在很多公司都出售这种框架 
      

  13.   

    如果要实现全面的权限管理,请尝试搜索一下RBAC,基于角色的访问控制。
      

  14.   

    首先要有一个权限分配表,admin用户可以给其他用户分配权限.到这张表里面.然后在后台菜单里面根据这张表的权限分配,可以根据需求生成具体的菜单.
      

  15.   

    有那么复杂么
    我用J2EE和ASP.NET都实现过权限管理好像并不复杂啊
    弄清楚关系不难下手吧
      

  16.   

    呵呵
    这种小权限的问题用if判断
    不过你要在后台进行控制
    确实需要基于角色权限的管理
    可以看下RBAC0 
      

  17.   

    其实,在.net的技术里面,这种功能已经被系统实现得非常好了
    那就是通过若干个xml文件去对应相应权限的treeview
    这样,相应权限也只能调用相应的xml数据源,可实现显示不同的菜单和界面.JAVA也可以利用这种思想
    至于权限的管理,就如同上面说的,通过几个表及之间的对应关系就可以做到了
      

  18.   

    看看这个链接:
    http://www.metadmin.com/tech/category.html以及这个FLASH演示:http://www.metadmin.com/download/showEmployees.html
      

  19.   

    用户角色不多的话(就几个角色搞定),完全可以后台写死,做判断,当用户角色为A的话可以访问哪些页面,B的话可以
    如果用户可以自定义角色分配的话那就要看RBAC了,http://baike.baidu.com/view/73432.htm
      

  20.   

    权限表: 
    id 权限名
    1   修改报表金额
    2   导出报表
    3   
    角色表
    1 经理
    2 文员
    3 助理权限组
    id 角色id 权限id
    1   经理id   修改金额
    2   经理id   导出报表
    3   经理id   炒鱿鱼
    4   文员id   打印报表
    5   助理id   导出报表
    一个角色等于 拥有一组权限而不是一个权限,权限是单个的对象,可以任意组合至某个权限组,判断有无权限,检查角色即可。
      

  21.   

    用户表,权限表表之间要有主外键关系!!!
    先用list显示出所有的用户id,name,以及对其所拥有的权限的描述!!!!!!!!!!!!!!!!
    页面设置编辑按钮和删除按钮,跳转到编辑页面后选择该用户可以拥有的权限,存到数据库中;
    然后保存,显示出来!
    其中有许多细节的好好思考!!!!
    可以给你介绍一个例子
    客户信息管理系统(CRM)
      

  22.   

    这近刚做这个
    三张实体表
    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        文章删除
    显然它是没有栏目添加权限的
      

  23.   

    57L做广告啊!!这个权限基本上不是很难(看起来没啥太大要求)我之前说过 直接在控制层判断SESSION就可以了 如果想更效果一点的话 那就在页面判断用户SESSION然后根据SESSION显示菜单 如果说权限分类比较多的话(就是说很多人有不同的权限的情况下) 那你就得另建个表了 而且将要做的判断也比较多的说总之 权限的两种方式(我的理解啊)1. 有门 门锁着
    2. 没门 干脆就让没权限的人看不到进去的方式
      

  24.   

    没权限的 给他看个 Enable = false 的页面 呵呵
      

  25.   

    dddddddddddddddddddddddddddddddddddddddddddddddd
      

  26.   

    security不久可以么?后台管理security不正合适么
      

  27.   

    这近刚做这个 
    三张实体表 
    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        文章删除 
    显然它是没有栏目添加权限的
      

  28.   

    说实在的,关于权限这个东西,struts,spring都有很好的解决方案.没有具体的页面材料,我也真不知道怎么解释
      

  29.   


    说的没错,那么我来说说具体的操作方案。第一,建立模块表
    第二,建立功能表说明一下,为什么要把模块和功能分开?拿前面一个老兄的例子来说,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;//这样就得到了选定功能的组合
    }
    最后,要把选定功能集合的每个功能与角色对应保存在“角色&功能对应表”,这个我就不用说了吧。
    到此为止,大家看明白了么?不明白可以问我,呵呵
      

  30.   

    我也有此方面的需求,学习ing
      

  31.   

    你说的那些jguard都很容易实现的,我这段时间一直用它LZ可以去试下
      

  32.   

    我用过权限字符串用一张权限表,其中包含若干个操作的允许/禁止的字段,然后将用户权限或者用户组权限用字符串表示例如:admin的权限是0000,那么表示他对用户具有增加/删除/修改/查询的权限
    tom的权限是1110,那么表示他对用用户只具有查询的权限。