RBAC 基于角色访问控制 & 具体实现

RBAC 基于角色访问控制 & 具体实现

1、啥是RBAC?

在这里插入图片描述

emm 说人话就是 用户表 join 用户角色表 join 角色表 join 角色权限表 join 权限表(反正我是这么理解的)。

  
那有啥用呢?
比如配置用户的时候只需要给用户配置角色就好,具体实现就是维护“用户角色表”,而配置角色
也是同理,只需要给相应角色配置权限,维护角色权限表就好,而用户表、角色表、权限表就通过两张关
系表来建立关联,这样比如在登陆的时候就可以获得用户、用户的角色、用户具有的权限balabala。
 
 
那有啥好处呢?
灵活呗,比如现在有个新需求,增加一个权限,那只需要 1、配置权限表 2、给角色配置权限,没了,和用户
表没啥关系,拓展性也好,想弄多少角色弄多少,想弄多少权限弄多少(为啥这么说呢,我真的见过有的项目
用户权限关系通过一个字段存数组来实现的🙃),大概就这样。


好用吗?
好用呀,要不实现他干啥?开整。

2、数据库表

// 基础用户表
create table sys_user
(
    id varchar(64) null,
    user_name varchar(64) null,
    user_pwd varchar(128) null,
    user_nick_name varchar(64) null,
    user_icon varchar(128) null,
    user_phone varchar(16) null,
    user_email varchar(64) null,
    create_time timestamp null,
    create_user varchar(64) null,
    modify_time timestamp null,
    modify_user varchar(64) null,
    is_delete int null,
    constraint sys_user_pk
        primary key (id)
) engine=innoDB default charset=utf8;

create unique index sys_user_user_name_uindex
	on sys_user (user_name);

// 用户角色关系表
create table sys_user_role
(
    id varchar(64) null,
    user_id varchar(64) null,
    role_id varchar(64) null,
    constraint sys_user_role_pk
        primary key (id)
) engine=innoDB default charset=utf8;

// 角色表
create table sys_role
(
    id varchar(64) null,
    role_name varchar(64) null,
    role_describe varchar(64) null,
    create_time timestamp null,
    create_user varchar(64) null,
    modify_time timestamp null,
    modify_user varchar(64) null,
    is_delete int null,
    constraint sys_role_pk
        primary key (id)
) engine=innoDB default charset=utf8;

// 角色权限关系表
create table sys_role_right
(
    id varchar(64) null,
    role_id varchar(64) null,
    right_id varchar(64) null,
    constraint sys_role_right_pk
        primary key (id)
) engine=innoDB default charset=utf8;

// 权限表
create table sys_right
(
    id varchar(64) null,
    right_name varchar(64) null,
    right_icon varchar(64) null,
    right_url varchar(64) null,
    create_time timestamp null,
    create_user varchar(64) null,
    modify_time timestamp null,
    modify_user varchar(64) null,
    is_delete int null,
    constraint sys_right_pk
        primary key (id)
) engine=innoDB default charset=utf8;

3、增删改查

在这里插入图片描述

那后面就是我们的领域了奥!增删改查呗,需要注意的是,删除用户的时候也要删除用户角色关系,删除角色的时
候也一样,那就有个问题了,那我给角色更新权限的时候岂不是很麻烦?我的做法是更新的时候直接删除关系表数
据,重新建立关系。

至于登录就:


select * from sys_user u
        left join sys_user_role ur on u.id = ur.user_id
        left join sys_role r on ur.role_id = r.id
        left join sys_role_right rr on rr.id = rr.role_id
        left join sys_right ri on rr.right_id = ri.id 
where u.user_name = ?1;

至于权限表的父子关系,集合到树的转换可以看前面的文章:
Java8通过Stream把集合转换成树

还有就是上面说的,删除用户的时候别忘了删除用户角色关系表,删除角色的时候别忘了删除角色权限关系表(如
果有用户是该角色的话不给删除,提示“xxx正在使用xxx角色,不能删除”),删除权限的话我觉得还是那种提示“当
前有xxx角色正在使用xxx权限,不能删除”,没有使用的嘛就直接删除。

实现了所有接口后,就可以试着把权限啥的直接交给Shiro或者SpringSecurity来做安全这块的东西啦,还有密码别
忘了加密哟,推荐BCrypt加密,可以看这篇文章:
BCrypt加密 & 密码校验

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值