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加密 & 密码校验