首页 > 其他 > 详细

基于角色的权限管理(RBAC)

时间:2015-11-20 02:13:53      阅读:286      评论:0      收藏:0      [点我收藏+]

基于角色的权限管理(RBAC)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——我一直不太信任自己的记忆力,所以我把它们都写下来

? ? ? ? ? ? ?

? ? ? 这几天一直想把web项目中菜单的管理梳理一遍,今天终于写了个小Demo。在这个过程中融合了linux权限管理的思想。具体的阐述记录在代码中,我相信这个注释将会非常详细。

?

项目结构如下图:
bubuko.com,布布扣

?

?

?

?

?

?

?

?

?

?

?

?

Main.java中是菜单权限控制的核心

package com.albert.test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.albert.model.Menu;
import com.albert.model.Person;
import com.albert.model.Role;
import com.albert.service.BaseService;

/**
 * @{#} Main.java Created on 2015-11-19 上午11:57:18
 * 主测试方法
 */

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
       BaseService service = new BaseService();
       List<Role> roles = service.initRole();
       List<Menu> menus = service.initMenu();
       
       /**
        * 模拟当前登录用户,目前写死为张三,ID是1
        */
       Person curPerson = service.initPerson().get(0);
       /**
        * 当前登录用户的角色
        */
       Role curRole  = null;
       for(Role r : roles){
           if(curPerson.getRoleId()==r.getId()){
               curRole = r;
               break;
           }
       }
       
       System.out.println("当前用户:"+ curPerson.getName());
       System.out.println("当前角色:"+ curRole.getName());
       
       /**
        * 当前用户的menu
        */
       List<Menu> curMenus = new ArrayList<Menu>();
       /**
        * 当前用户menu的父menu
        */
       Set<Menu> parentMenus = new HashSet<Menu>();
       /**
        * 这个for语句块是这个demo的核心加重点。
        * t_menu表中所有子菜单都有一个不重复的sn,比如《用户新增》的sn是0,
        * 《用户修改》的sn是1;
        * 
        * 某个角色(t_role)对以上两个菜单有权限,那么acl = 2^0+2^1,
        * 也就是3。看到这里是不是一头雾水?
        * 
        * 验证这个角色是否有《用户修改》权限,只需要 &运算符,即 2^1 & 3,
        * 结果是2,非0即说明拥有该权限。
        * 
        *   这个原理如下:
        *   3 二进制   0000 0011
        *   2 二进制   0000 0010
        *   &运算后    0000 0010 非0,则有这个权限
        */
       for(Menu m : menus){
           Double sn = Math.pow(2d, m.getSn());
           if((sn.intValue() & curRole.getAcl())!=0){
               curMenus.add(m);
               for(Menu n : menus){
                   if(m.getPid() == n.getId()){
                       parentMenus.add(n);
                   }
               }
           }
       }
       
       //显示菜单(打印到控制台)
       for(Menu m : parentMenus){
           System.out.println("》"+m.getName());
           for(Menu n : curMenus){
               if(n.getPid() == m.getId()){
                   System.out.println("  |"+n.getName());
               }
           }
       }
      
    }

}

? 运行main方法打印控制台输出如下
bubuko.com,布布扣

?

?

?

?

?

?

?

?

?

?

项目svn地址:http://code.taobao.org/svn/TestRbac/TestRbac

?


?

?

?

基于角色的权限管理(RBAC)

原文:http://zyqwst.iteye.com/blog/2257905

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!