zoukankan      html  css  js  c++  java
  • 权限系统设计五张表

    今天开始,做旅游网站的后台管理,众所周知,权限系统是每个系统里面必备的最基本的系统,然而权限系统设计有点挺麻烦,现在整理了下,分享给正在开发此模块的朋友一个思路!

      设计基础:用户、角色、权限三大核心表,加上用户角色、角色权限两个映射表(用于给用户表联系上权限表)。这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限。

      大致用到5张表:用户表(UserInfo)、角色表(RoleInfo)、菜单表(MenuInfo)、用户角色表(UserRole)、角色菜单表(RoleMenu)。

    各表的大体表结构如下:

      1、用户表(UserInfo):Id、UserName、UserPwd

      2、角色表(RoleInfo):Id、RoleName

      3、菜单表(MenuInfo):Id、MenuName

      4、用户角色表(UserRole):Id、UserId、RoleId

      5、角色菜单表(RoleMenu):Id、RoleId、MenuId

      最关键的地方是,某个用户登录时,如何查找该用户的菜单权限?其实一条语句即可搞定:

      假如用户的用户名为Arthur,则他的菜单权限查询如下:

      Select m.Id,m.MenuName from MenuInfo m ,UserInfo u, UserRole ur, RoleMenu rm Where m.Id = rm.MenuId and ur.RoleId = rm.RoleId and ur.UserId = u.Id and u.UserName = 'Arthur'

      任何权限的需求,都是为广义的用户分配角色,角色拥有广义的权限。角色是最重要的中枢,隐藏做幕后黑手,从不出现在业务代码里,用行话说就是解除了用户和权限的直接耦合。

      角色把用户抽象化了,几百个用户变成成几个角色,用户->角色->权限写成通用判断权限的方法:currUser.IsHave(xx权限)。核心就是一个sql联表查询语句,查询条件为用户id。

    例如:
    部门权限:部门也是一种用户,建立 部门表、部门角色表。通用权限方法里加上 当前部门->部门所属角色->权限 
    职位权限:职位也是一种用户,建立职位表、职位角色表,同上
    菜单:也是一种权限,建立 菜单表、角色菜单表,就把菜单纳入了权限管理。通用权限方法里加上 角色列表->权限、菜单

    使用Microsoft SQL Server应用代码构建如下:

    1、用户信息表:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create table employee 
       userid varchar(50) not null,  ---用户ID 
       username varchar(100),    ---用户名 
       userpassword varchar(100), ---密码 
       .. 
       .. 
       .. 
       .. 
    alter table employee        --主键 
    add constraint pk_employee_userid primary key (userid)

     2、角色表:

    1
    2
    3
    4
    5
    6
    7
    create table role 
      roleid varchar(50) not null--角色Id 
      rolename varchar(100),        --角色名称 
    alter table tole     --主键 
    add constraint pk_role_roleid primary key (roleid)

      3、权限菜单表 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table popedom 
      popedomid int identity(1,1) not null--权限Id 
      popedomname varchar(100), --权限名称 
      popedomfatherid int,      --权限父ID 
      popedomurl varchar(100)   --树的连接路径 
      .. 
      .. 
    ) 
    er table popedom       --主键 
    add constraint PK_popedom primary key (popedomid)  

      添加数据如
    insert into popedom values('我的办公桌',0,'')
    insert into popedom values('电子邮箱',1,'../mail/EmaiolManage.aspx')
    (添加数据的原则是一级接点的popedomfatherid 为0,如果是(我的办公桌)下面的接点,它们的popedomfatherid为(我的办公桌)的主键)

    4、用户与角色关系表

    1
    2
    3
    4
    5
    6
    7
    8
    create table user_role 
     connectionid int identity(1,1) not null--关系ID 
      userid varchar(50) not null,   --管理员表ID 
      roleid varchar(50) not null   --角色Id 
    alter table user_role    --主键 
    add constraint PK_admin_role primary key(connectionid)  

      5、角色与权限关系表

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table role_popedom     --角色与权限表 
      connectionid int identity(1,1), --关系Id 
      roleid varchar(50) not null,      --角色ID 
      popedomid int not null,   --权限Id 
      popedom    int   --权限 (1为可用,2为不可用) 
    alter table role_popedom       --主键 
    add constraint PK_role_popedom primary key(connectionid) --主键 
  • 相关阅读:
    小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载一(PhoneGap中的API)
    有一种蓝,是神往,是心醉,是心伤
    persits.jpeg 水印组件
    SD卡操作相关的工具SDCardUtils
    apollo 消息分发源代码分析
    tcp ip协议笔记(1)——简单介绍
    百度地图SDK调试SDKInitializer.initialize(getApplicationContext())错误
    一气呵成编完代码的感觉对不正确
    多线程编程1-NSThread
    VIP的转移
  • 原文地址:https://www.cnblogs.com/wangpengb/p/11195350.html
Copyright © 2011-2022 走看看