Spring Boot集成Spring Security系列四之接口鉴权

1,048 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

大家好,我是程序员路飞,三年的下水道打杂前端,喜欢研究技术,正在往全栈发展
欢迎小伙伴们加我微信:DZHningmeng,一起讨论,期待与大家共同成长🥂

前言

这是Spring Boot集成Spring Security的第四章,我将会通过这个系列文章,包括完整的项目搭建、编码过程实现(认证和授权),关键点讲解,来帮助大家了解Spring Security在实际项目中的应用

今天这篇内容主要是接口鉴权

源码链接

往期系列

Spring Boot集成Spring Security系列一之搭建项目

Spring Boot集成Spring Security系列二之查询用户

Spring Boot集成Spring Security系列三之自定义登录

功能编码

表结构分析

因为用户的接口权限数据是保存在数据库表中,不同的用户关联着不同的接口权限

  • ums_admin: 用户信息表
  • ums_permission: 权限信息表
  • ums_admin_permission_relation: 用户信息权限关联表

编码

编写查询用户权限的service

@Select("select * from ums_permission p where p.id in (select permission_id from ums_admin_permission_relation r where r.admin_id = #{id})")
List<UserPermission> queryUserPermissionById(@Param("id") Integer id);

这边启动项目debug,可以看到权限已经被查询出来和数据的一致

image.png

上一篇我们通过username查询user的接口没有增加权限的注解,所有是可以访问的,现在加上注解再启动项目试下

先执行sql添加权限数据

INSERT INTO `ums_permission` VALUES ('6', '0', '通过username查询用户', 'ums:query:username', null, '1', '/user//queryUserByUsername', '1', NOW(), '0');

INSERT INTO `ums_admin_permission_relation` VALUES ("2", "1", "6", NULL);
@Override
public List<UserPermission> queryUserPermissionById(Integer id) {
    return userMapper.queryUserPermissionById(id);
}

userDetailsService中调用

@Bean
public UserDetailsService userDetailsService() {
// 获取登录用户信息
return username -> {
  User admin = userService.queryUserByUsername(username);
  if (admin != null) {
    List<UserPermission> permissionList = userService.queryUserPermissionById(admin.getId());
    return new AdminUserDetails(admin, permissionList);
  }
  throw new UsernameNotFoundException("用户名或密码错误");
};
}

测试

先测试添加一个不存在的权限注解,可以看到报403

image.png

image.png

再测试我们sql插入的权限数据

image.png

image.png

小结

通过上面流程已经完成了一个基本的接口鉴权的功能,可以实现数据库动态控制,但是这个设计还是偏简单,主要带大家对Spring Security实现鉴权的基本功能了解,后面我们会设计出更加复杂,适用于更大系统的鉴权管理

🚴‍♀️ 结束语

通过项目实践,结合具体的步骤,输出相关的文章,给小伙伴一些有些的知识点,希望大家喜欢我的文章,希望认识到更多志同道合的伙伴,如果你也对技术感兴趣,可以加我好友互相探讨一起进步

Github: Cheering-baby

公众号: 程序员路飞

vx: DZHningmeng

最后,如果喜欢我的文章,可以给个赞👍或者关注➕都是对我最大的支持