创建用户权限表 t_user_role
在 mysql 数据库管理工具中在数据库执行如下语句创建新表:
CREATE TABLE `t_user_role` (
`id` bigint(20) UNSIGNED NOT NULL COMMENT 'id',
`username` varchar(60) NOT NULL COMMENT '用户名',
`role` varchar(60) NOT NULL COMMENT '角色',
`create_time` datetime NOT NULL DEFAULT current_timestamp() COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户角色表' ROW_FORMAT=DYNAMIC;
ALTER TABLE `t_user_role`
ADD PRIMARY KEY (`id`) USING BTREE,
ADD KEY `idx_username` (`username`) USING BTREE;
ALTER TABLE `t_user_role`
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id';
COMMIT;
创建完成后得到如下结构的表
首先在 common.domain.dos 包下创建 UserRoleDO 类
在 common.domain.mapper 包下创建 UserRoleMapper 类,构建一个通过用户名查询数据条目的方法:
对之前访问权限不足处理器 RestAccessDeniedHandler 类的留白部分进行补充:
同时需要在 ResponseCodeEnum 中添加新的异常状态码:
在 admin.config 下的 WebSecurityConfig 配置类中开启 Security 的一些注解,同时启用访问权限不足的处理器 RestAccessDeniedHandler。
在 @EnableGlobalMethodSecurity 中, 设置 prePostEnabled = true 可以启用 @PreAuthorize 和 @PostAuthorize 注解。
@PreAuthorize 注解在方法执行前进行权限验证,而 @PostAuthorize 注解在方法执行后进行权限验证。
设置 securedEnabled = true 可以启用 @Secured 注解。@Secured 注解用于定义业务方法的安全配置,只有那些具有指定角色的用户才可以调用该方法。例如:
注意: @Secured 注解不支持 Spring EL 表达式,指定的角色必须以 ROLE_ 开头。
对于权限不足的情况,我们还要手动抛出错误。在 common.exception 包下的全局异常处理类 GlobalExceptionHandler 中定义方法:
注意: 捕获该类需要在 common 模块下添加 Security 依赖,在 weblog-module-common 的 pom.xml 配置文件中添加依赖:
重新写一下 jwt.service 中的 UserDetailServiceImpl,我们已经建立了连接数据库获取用户权限的逻辑,接下来将他运用到接口中:
在 TestController 中新建测试接口:
同时在 t_user 表中新建用户 test, 密码使用 jwt 模块下 PasswordEncoderConfig 中的方法加密一下之后填入。然后在 t_user_role 表中设定用户的权限,给管理员账号设定 ROLE_ADMIN 的角色,给新建的 test 用户设定 ROLE_VISITOR 角色。最后数据项如下:
可以在 api 文档中进行调试,登录对应账户获取 token,添加到请求头中看看是否正常地验证了用户权限
获取一个用户的信息,只需要通过用户名来请求,所以重点需要构建响应的 VO,在 admin.model.vo.user 下新建 FindUserInfoRspVO 类,对于请求用户信息的响应,我们目前定义是返回其用户名和角色列表,以便在前端显示:
请求一次修改密码,需要用户名、原密码和旧密码三项内容,在 admin.model.vo 下新建 UpdateAdminUserPasswordReqVO 类:
同时需要引入参数验证所需的依赖包,在 admin 模块下的 pom.xml 中添加以下依赖:
在 admin.service 下新建接口 AdminUserService:
接下来对两个接口进行实现。在 admin.service.impl 中创建类 AdminUserServiceImpl:
之前在验证中,我们将用户名存储到了 ThreadLocal 中,在实现获取用户信息的接口时直接调用即可。对于修改密码中的几种错误情况,我们也需要定义相应的异常状态码。在异常状态码枚举类中添加定义:
在 admin.controller 下创建 AdminUserController 类:
搭建的时候写的太上头忘记写文档了,代码都是全写完之后提交的,没法一点点来说,直接看提交记录吧各位🥺
后台页面骨架搭建 · monthwolf/weblog-vue3@f75a413
暗色模式 · monthwolf/weblog-vue3@0e424f4
获取用户信息和修改密码 · monthwolf/weblog-vue3@64d7998
对接后端api · monthwolf/weblog-vue3@f61948d