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小时内删除。
发表评论