Java论坛系统--3.系统⽤户⾓⾊权限表结构设计
通常我们的⽹站都有权限控制,就像⼀个公司有产品、开发、运维之分,各⾃负责各⾃的业务,相互独⽴,有相互协作,共同完成⼀个任务。拥有不同权限的⽤户查看不同的页⾯,进⾏不同的操作。
Shiro是⼀种轻量级的安全框架,主要是做登录验证,权限检查,相对 Spring Security 是要简单很多,源码也很清晰。
表结构
在这⾥我主要是针对后台的⽤户操作权限的设计:
1.定义⽤户表 sys_user,我在⽤户表⾥⾯没有定义有关授权⽅⾯的,这个后⾯在登陆⽅⾯才⽤到。
id    int    ⽤户id
user_name    varchar    账号
nick_name    varchar    昵称
user_img    varchar    头像
user_address    varchar    地址
sex    varchar    性别
phone    varchar    ⼿机号
email    varchar    邮箱
email_verified    int    邮箱是否验证,0未验证,1已验证
money    int    money
user_grade    int    ⽤户层级 普通⽤户0  vip 1 超级vip2
state    int    状态,0正常,1冻结
last_login_time    datetime    最后登录时间
2,⾓⾊表 sys_role
id    int
role_code    varchar
role_name    varchar    ⾓⾊名称
role_type    int    ⾓⾊类型 1是管理⾓⾊ 2是VIP⾓⾊
description    varchar    ⾓⾊描述
state    int    状态:1有效;2删除
order_no    int    排序
3,⽤户⾓⾊关系表 sys_users_roles
id    int
user_id    varchar    ⽤户id
role_id    varchar    ⾓⾊id
4,权限表 sys_permission
id    int
permission_name    varchar    权限名称
description    varchar    权限描述
url    varchar    权限访问路径
permission_code    varchar    权限标识
parent_id    int    ⽗级权限id
type    int    类型  0:⽬录  1:菜单  2:按钮
sort    int    排序
icon    varchar    图标
state    int    状态:1有效;2删除
5,⾓⾊权限表 sys_role_permissions
id    int
role_id    varchar    ⾓⾊id
permission_id    varchar    权限id
permission_type    tinyint    权限类型 1为⽬录权限 2为板块权限 3为其他权限
结构如下
说明:
1,⽤户与⾓⾊的关系是⼀对多,⼀个⽤户可以有多个⾓⾊。
2,sys_menu后台菜单表也叫权限表。
3,sys_role_permission是⾓⾊权限表,⼀个⾓⾊是多个权限的集合,⾥⾯的permission_id可以包括多种权限,包括sys_menu⾥⾯的权限点。
4,根据上⾯的关系,就是⼀个⽤户包括多个⾓⾊,每个⾓⾊⼜包括多个权限,这样就可以将⽤户与⾓⾊,⽤户与权限点关联起来。
SQL
获取⽤户⾓⾊
<select id="listByUserId" resultMap="BaseResultMap">  SELECT
r.*
FROM
sys_user u,
sys_role r,
sys_users_roles ur
WHERE
u.id = #{userId}
AND u.id = ur.user_id
AND r.id = ur.role_id
</select>
获取⽤户权限
<select id="listByUserId" resultMap="BaseResultMap">  SELECT
m.*
FROM
sys_user u,
sys_role r,
sys_users_roles ur,
sys_menu m,
sys_role_permissions rp
WHERE
u.id = #{userId}
AND u.id = ur.user_id
le_id = r.id
AND r.id = rp.role_id
and rp.permission_id = m.id
and rp.permission_type = 1
</select>
界⾯
⽤户管理
⽤户新增的时候可以选择⾓⾊(多选)
⾓⾊管理
⾓⾊编辑和⾓⾊权限分配
⾓⾊权限分配的时候,通过当前选择⾓⾊去后台查询⾓⾊对应的权限点,
/**
* 获取⾓⾊的菜单
*
* @param roleId
* @return
* @author JAVABB
*/
public List<MenuDO> listByRoleId(Integer roleId) {
List<MenuDO> permissionList;
最新论坛网站源码if (roleId == Constant.ADMIN_ROLE_ID) { // 如果是管理员,拥有所有权限            permissionList = this.queryAll();
} else {
JSONObject param = new JSONObject();
param.put("sqlid", Name() + ".listByRoleId");
param.put("roleId", roleId);
permissionList = this.queryList(param);
}
return permissionList;
}
/**
* 将权限封装成树
* @return
*/
public List<Tree> listTree() {
List<Tree> treeList = new ArrayList<>();
List<MenuDO> permissionList = this.queryAll();
permissionList.forEach(p -> {
Tree t = new Tree();
t.Id() + "");
t.ParentId() + "");
t.MenuName() + "/" + p.getPermissionCode());
treeList.add(t);
});
return treeList;
}
/**
* 根据roleId获取带勾选的树
*
* @param roleId
* @return
*/
public List<Tree> checkTreeByRoleId(Integer roleId) {
List<Tree> allTreeList = listTree();
List<MenuDO> checkPermissionList = listByRoleId(roleId);
for (Tree t : allTreeList) {
for (MenuDO p : checkPermissionList) {
if (t.getId().Id() + "")) {
t.setChecked(true);
}
}
}
return allTreeList;
}
通过⽅法checkTreeByRoleId就可以形成⼀个树
前台采⽤ztree树插件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。