本帖最后由 hejinxu 于 2009-07-18 13:16:48 编辑

解决方案 »

  1.   

    模块就是资源. 按钮就是操作...
    每个资源中定义操作...比如, 用户模块中有注册, 登录操作.
    class Module {
     Permission[] permissions;
    }
    class Permission {
     int location;
     String name;
    }
    每种操作代表一位..比如注册是第一位, 登录是第二位.(从后向前数....这里看不明白可以先记下来..)用户模块这个资源的json表示为:
    user : {
      permission : [
        {1, "注册"}, 
        {2, "登录"}
      ]
    }好了, 讲以下, 每个用户的权限怎么和资源关联起来..中间表咯...
    中间表存留一个用户的标识(id)和一个资源的标识(id), 还有一个表示权限的操作符..这里我们用int型的数来表示..这个中间表我们叫做访问控制列表: 
    class Acl {
     User user; //用户关联, 可以建成弱关联.
     Module module; //模块关联, 可以建成弱关联.
     int authorized; //权限标识符.
    }那么我们怎么来操作权限呢?
    权限的操作通常有赋予权限和获取权限. 这里讲讲赋予权限吧..
    int authorized初始化的时候, 值是0;
    假设现在要赋予登录的权限. 注册这个Permission的location对应的是2; 也就是从右往左数的第二位.
    定义一个临时的int temp = 1; 我们的登录位是第二位. 
    temp现在转成二进制是: 00000000 00000000 00000000 0000001(int有32位)
    将temp左移1位. 得到temp = 00000000 0000000 0000000 00000010
    此时, 可以看到, temp只有表示登录的第二位是1, 其余都是0;
    将temp和acl中的authorized进行或操作,
    temp | authorized, 得到的是: 00000000 00000000 00000000 00000010
    回忆一下或操作, 0会保留原来的操作位不变, 1不论原操作位是什么, 都设置为1.
    那么我们已经成功为authorized设置了登录的权限.哎呀, 讲的有点模糊了....将就听听吧...详细可以查查linux的文件权限相关资料和RBAC的授权资料.
      

  2.   

    lz 看看我的思路:1. 在数据库中建user、role(角色表)、permesion(权限表).2. user{uid, rid(关联角色表主键) }.
       role{rid, rname(角色名称) }.
       permesion{pid, rid(关联权限表主键)}.3. 一个用户只有一个角色, 一个角色对象多个权限.
      

  3.   


    /*
    MySQL Data Transfer
    Source Host: localhost
    Source Database: store
    Target Host: localhost
    Target Database: store
    Date: 2009-7-13 22:01:49
    */SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for popedom
    -- ----------------------------
    DROP TABLE IF EXISTS `popedom`;
    CREATE TABLE `popedom` (
      `nm` varchar(40) NOT NULL,
      `expl` varchar(40) NOT NULL DEFAULT '',
      `st` bit(1) NOT NULL DEFAULT '\0',
      PRIMARY KEY (`nm`),
      KEY `ns` (`nm`,`st`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records 
    -- ----------------------------
    /*
    MySQL Data Transfer
    Source Host: localhost
    Source Database: store
    Target Host: localhost
    Target Database: store
    Date: 2009-7-13 22:02:10
    */SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for role
    -- ----------------------------
    DROP TABLE IF EXISTS `role`;
    CREATE TABLE `role` (
      `nm` varchar(40) NOT NULL,
      `expl` varchar(40) NOT NULL DEFAULT '',
      `st` bit(1) NOT NULL DEFAULT '\0',
      PRIMARY KEY (`nm`),
      KEY `ns` (`nm`,`st`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records 
    -- ----------------------------
    /*
    MySQL Data Transfer
    Source Host: localhost
    Source Database: store
    Target Host: localhost
    Target Database: store
    Date: 2009-7-13 22:02:14
    */SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for roleinfo
    -- ----------------------------
    DROP TABLE IF EXISTS `roleinfo`;
    CREATE TABLE `roleinfo` (
      `nm` varchar(40) NOT NULL,
      `pnm` varchar(40) NOT NULL,
      `st` bit(1) NOT NULL DEFAULT '\0',
      PRIMARY KEY (`nm`,`pnm`),
      KEY `pnm` (`pnm`),
      CONSTRAINT `roleinfo_ibfk_1` FOREIGN KEY (`nm`) REFERENCES `role` (`nm`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `roleinfo_ibfk_2` FOREIGN KEY (`pnm`) REFERENCES `popedom` (`nm`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records 
    -- ----------------------------
    /*
    MySQL Data Transfer
    Source Host: localhost
    Source Database: store
    Target Host: localhost
    Target Database: store
    Date: 2009-7-13 22:01:00
    */SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for admin
    -- ----------------------------
    DROP TABLE IF EXISTS `admin`;
    CREATE TABLE `admin` (
      `id` char(14) NOT NULL,
      `sid` varchar(50) NOT NULL DEFAULT '',
      `nm` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `pw` blob,
      `lst` bit(1) NOT NULL DEFAULT '\0',
      `st` bit(1) NOT NULL DEFAULT '\0',
      `rn` varchar(40) NOT NULL DEFAULT '',
      `edt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `ldt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `ndt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `lip` varchar(30) NOT NULL DEFAULT '',
      `nip` varchar(30) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `nm` (`nm`),
      KEY `rn` (`rn`),
      KEY `nm_2` (`nm`),
      CONSTRAINT `admin_ibfk_1` FOREIGN KEY (`rn`) REFERENCES `role` (`nm`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;