黑马程序员技术交流社区

标题: 【郑州校区】学成在线-第18天-讲义-用户授权 三 [打印本页]

作者: 我是楠楠    时间: 2020-1-8 16:16
标题: 【郑州校区】学成在线-第18天-讲义-用户授权 三
【郑州校区】学成在线-第18天-讲义-用户授权 三

3 动态查询用户权限
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
查询用户所拥有的角色
查询用户所拥有的权限
例子:

[AppleScript] 纯文本查看 复制代码
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 需求分析
认证服务请求用户中心查询用户信息,用户需要将用户基本信息和用户权限一同返回给认证服务。
本小节实现用户查询查询用户权限,并将用户权限信息添加到的用户信息中返回给认证服务。
以上需求需要修改如下接口:
[AppleScript] 纯文本查看 复制代码
 @GetMapping("/getuserext")
public XcUserExt getUserext(@RequestParam("username") String username);


3.3.2 DAO
在用户中心服务中编写dao,实现根据用户id查询权限。
1、定义XcMenuMapper.java
com.xuecheng.ucenter.dao包下定义:
[AppleScript] 纯文本查看 复制代码
 @Mapper
public interface XcMenuMapper {
public List<XcMenu> selectPermissionByUserId(String userid);
}


2XcMenuMapper.xml
com.xuecheng.ucenter.dao下定义XcMenuMapper.xml
[AppleScript] 纯文本查看 复制代码
 <?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方法,查询用户权限。
[AppleScript] 纯文本查看 复制代码
 //根据账号查询用户的信息,返回用户扩展信息
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,查询用户的权限,并拼接权限串,将原来硬编码权限代码删除,代码如
下:

[AppleScript] 纯文本查看 复制代码
......
//请求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令牌,测试授权







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2