学成在线-第18天-讲义-用户授权 三

本文介绍了用户授权系统的设计,包括动态查询用户权限的需求分析、数据模型及其使用。讲解了如何查询用户权限、分配权限的步骤,并展示了在用户中心和认证服务中实现权限查询的方法。同时,提供了测试流程,确保权限系统功能的正确性。
摘要由CSDN通过智能技术生成

动态查询用户权限 
3.1 需求分析 
截至目前在测试授权时使用的权限数据是静态数据,正常情况的流程是: 
1、管理员给用户分配权限,权限数据写到数据库中。 
2、认证服务在进行用户认证时从数据库读取用户的权限数据(动态数据) 
本节实现动态权限数据。 
3.2 权限数据模型 
3.2.1 数据模型结构 
打开xc_user数据库,找到下边的表:
 
xc_user:用户表,存储了系统用户信息,用户类型包括:学生、老师、管理员等 
xc_role:角色表,存储了系统的角色信息,学生、老师、教学管理员、系统管理员等。 
xc_user_role:用户角色表,一个用户可拥有多个角色,一个角色可被多个用户所拥有 
xc_menu:模块表,记录了菜单及菜单下的权限 
xc_permission:角色权限表,一个角色可拥有多个权限,一个权限可被多个角色所拥有 
3.2.2 数据模型的使用 
本项目教学阶段不再实现权限定义及用户权限分配的功能,但是基于权限数据模型(5张数据表)及现有数据,要 
求学生在数据库中操作完成给用户分配权限、查询用户权限等需求。 
1、查询用户所拥有的权限 
步骤: 
确定用户的id 
查询用户所拥有的角色 
查询用户所拥有的权限 
例子:
 

SELECT * FROM xc_menu WHERE id IN(
SELECT menu_id FROM xc_permission WHERE role_id IN(
SELECT role_id FROM xc_user_role WHERE user_id = '49'
)
)

2、给用户分配权限 
1)向已拥有角色分配权限 步骤: 
确定用户的id 
确定权限的id 
确定用户的角色 
向角色权限表添加记录 
2)添加角色给用户分配权限 步骤: 
确定用户的id 
确定权限的id 
添加角色 
向角色权限表添加记录 
向用户角色关系表添加记录
3.3 用户中心查询用户权限
3.3.1 需求分析 
认证服务请求用户中心查询用户信息,用户需要将用户基本信息和用户权限一同返回给认证服务。 
本小节实现用户查询查询用户权限,并将用户权限信息添加到的用户信息中返回给认证服务。 
以上需求需要修改如下接口:

@GetMapping("/getuserext")
public XcUserExt getUserext(@RequestParam("username") String username);

3.3.2 DAO 
在用户中心服务中编写dao,实现根据用户id查询权限。 
1、定义XcMenuMapper.java 
com.xuecheng.ucenter.dao包下定义:

@Mapper
public interface XcMenuMapper {
public List<XcMenu> selectPermissionByUserId(String userid);
}

2XcMenuMapper.xml 
com.xuecheng.ucenter.dao下定义XcMenuMapper.xml

<?xml version="1.0" encoding="UTF‐8" ?>
<!DOCTYPE mapper PUBLIC "‐//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis‐3‐
mapper.dtd" >
<mapper namespace="com.xuecheng.ucenter.dao.XcMenuMapper" >
<select id="selectPermissionByUserId"
resultType="com.xuecheng.framework.domain.ucenter.XcMenu" parameterType="java.lang.String" >
SELECT
id,
CODE,
p_id pId,
menu_name menuName,
url,
is_menu isMenu,
LEVEL,
sort,
STATUS,
icon,
create_time createTime,
update_time updateTiem
FROM
xc_menu
WHERE id IN(
SELECT menu_id FROM xc_permission WHERE role_id IN(
SELECT role_id FROM xc_user_role WHERE user_id = #{id}
)
)
</select>
</mapper>

其它Dao采用spring data 编写如下:

 
3.3.3 Service 
修改UserServicegetUserExt方法,查询用户权限。

//根据账号查询用户的信息,返回用户扩展信息
public XcUserExt getUserExt(String username){
XcUser xcUser = this.findXcUserByUsername(username);
if(xcUser == null){
return null;
}
//根据用户id查询用户权限
String userId = xcUser.getId();
List<XcMenu> xcMenus = xcMenuMapper.selectPermissionByUserId(userId);
XcUserExt xcUserExt = new XcUserExt();
BeanUtils.copyProperties(xcUser,xcUserExt);
//用户的权限
xcUserExt.setPermissions(xcMenus);
return xcUserExt;
}

3.4 认证服务查询用户权限 
修改认证服务的UserDetailServiceImpl,查询用户的权限,并拼接权限串,将原来硬编码权限代码删除,代码如 
下:

......
//请求ucenter查询用户
XcUserExt userext = userClient.getUserext(username);
if(userext == null){
//返回NULL表示用户不存在,Spring Security会抛出异常
return null;
}
//从数据库查询用户正确的密码,Spring Security会去比对输入密码的正确性
String password = userext.getPassword();
//指定用户的权限,这里暂时硬编码
List<String> permissionList = new ArrayList<>();
// permissionList.add("course_get_baseinfo");
// permissionList.add("course_find_pic");
//取出用户权限
List<XcMenu> permissions = userext.getPermissions();
for(XcMenu xcMenu:permissions){
permissionList.add(xcMenu.getCode());
}
......

3.5 测试 
1、执行登录,在redis中查看jwt令牌,使用jwt测试程序解析jwt令牌中是否包括用户的权限 。 
2、使用新的jwt令牌测试方法授权 
3、给用户分配新权限,重新生成jwt令牌,测试授权 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值