基于Spring Boot 3 + Spring Security6 + JWT + Redis实现接口资源鉴权

紧接上一篇文章,基于Spring Boot 3 + Spring Security6 + JWT + Redis实现接口资源鉴权

系列文章指路👉
系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类

项目源码👉
/shijizhe/boot-test

文章目录

    • 1. 修改 UserDetailsService
      • 修改取用户的权限列表
      • 将权限列表放入UserDetail中
    • 2. 新增认证和鉴权异常统一处理程序
      • 实现AuthenticationEntryPoint
      • 实现AccessDeniedHandler
    • 修改Security配置 YaSecurityConfig.securityFilterChain
    • 简单测试
      • 给方法加权限控制
      • 调用测试(事先已登录)

1. 修改 UserDetailsService

采用RBCA模型进行权限控制.

简化后我们有三个表: 用户表、用户角色关联表、角色权限关联表(表结构源码中有:src/main/resources/static/数据结构.sql)

修改取用户的权限列表

     <select id="listAuthorityById" resultType="java.lang.String">SELECT pe.permission_idFROM ya_user_role ro,ya_role_permission peWHERE ro.role_id = pe.role_idAND ro.user_id = #{userId}</select>

将权限列表放入UserDetail中

在这里插入图片描述

2. 新增认证和鉴权异常统一处理程序

做这一步的目的是:程序遇到未知的错误,仍可以返回json形式的错误信息,可以帮助排查问题。

实现AuthenticationEntryPoint

/*** <p>*  认证异常处理* </p>** @author Ya Shi* @since 2024/3/28 16:01*/
@Component
@Slf4j
public class YaAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {log.error("YaAuthenticationEntryPoint commence 认证过程中遇到异常:{}", authException.toString());ServletUtils.renderResult(response, new BaseResult<>(ResultEnum.FAILED_UNAUTHORIZED.code, "Security auth failed."));}
}

实现AccessDeniedHandler

/*** <p>* 鉴权异常处理* </p>** @author Ya Shi* @since 2024/3/28 16:06*/
@Component
@Slf4j
public class YaAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {log.error("YaAccessDeniedHandler handle 鉴权过程中遇到异常:{}", accessDeniedException.toString());ServletUtils.renderResult(response, new BaseResult<>(ResultEnum.FAILED_FORBIDDEN.code, "鉴权失败:" + accessDeniedException.getMessage()));}
}

修改Security配置 YaSecurityConfig.securityFilterChain

  1. 允许方法安全授权
@EnableMethodSecurity
  1. securityFilterChain新增异常统一处理
 .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler).and()

剩余重复代码就不贴了,上篇文章有。
在这里插入图片描述
在这里插入图片描述

简单测试

给方法加权限控制

@PreAuthorize("hasAuthority('ya_fruit_list')")
    @GetMapping("/testApi")@Operation(summary = "testApi", description = "测试使用-直接返回成功")@PreAuthorize("hasAuthority('ya_fruit_list')")public Object testApi(){String userId = UserAuthUtils.getUserId();System.out.println(userId);return BaseResult.success(userId);}

调用测试(事先已登录)

在这里插入图片描述
请求一个没有权限的接口:

    @GetMapping("/testApi2")@Operation(summary = "testApi2", description = "测试使用2-直接返回成功")@PreAuthorize("hasAuthority('test_test_123456')")public Object testApi2(){String userId = UserAuthUtils.getUserId();System.out.println(userId);return BaseResult.success(userId);}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578122.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U盘文件突然消失:原因分析与恢复策略

U盘遭遇“幽灵”之手&#xff0c;文件不翼而飞 你是否曾遭遇过这样的诡异情况&#xff1a;前一天还好好存放在U盘里的文件&#xff0c;第二天却突然消失得无影无踪&#xff1f;这简直就像是一场无声的灾难&#xff0c;令人措手不及。U盘作为我们日常工作和生活中不可或缺的数据…

算法系列之数组里的双指针

文章目录 算法系列之数组里的双指针快慢指针代替双重循环暴力解法快慢指针法 用双指针来排序暴力解法双指针排序 算法系列之数组里的双指针 在数组和链表的算法中双指针常出现&#xff0c;这篇用两道题来看一下双指针在数组算法里的用处。 快慢指针代替双重循环 https://lee…

嵌入式3-29

今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef unsigned char bgr[3]; int main(int argc, const char *argv[])…

安装docker 并搭建出一颗爱心树

1、docker介绍 Docker 是⼀个开源的容器运⾏时软件&#xff08;容器运⾏时是负责运⾏容器的软件&#xff09;&#xff0c;基于 Go 语 ⾔编写&#xff0c;并遵从 Apache2.0 协议开源。 Docker可以让开发者打包⾃⼰的应⽤以及依赖到⼀个轻量的容器中&#xff0c;然后发布到任何…

开源大数据集群部署(十九)Hbase部署

作者&#xff1a;櫰木 1 HBASE 安装部署 hbase组件部署主机HMasterhd1.dtstack.com,hd2.dtstack.comHRegionServerhd3.dtstack.com,hd2.dtstack.com,hd1.dtstack.com 2 创建hbase Kerberos主体 在每台机器上进行生成 bash /data/kerberos/getkeytabs.sh /etc/security/key…

Kaggle注册验证码问题(Captcha must be filled out.)

Kaggle注册验证码问题 Captcha must be filled out.使用Edge浏览器 Header Editor 插件安装 下载插件Header Editor 导入重定向脚本 点击扩展插件&#xff0c; 打开Header Editor插件&#xff0c;进行管理 点击导入输入下载链接进行下载或者导入本地json文件(二者任选其一…

OpenHarmony系统开发之应用接口文件转换工具介绍

简介&#xff1a; 应用接口文件转换工具是根据异构格式接口文件(.h 文件)转换生成 OpenHarmony 系统应用层需要的 TS(type-script)接口文件(*.d.ts)的工具。若某个服务实现方式为 c&#xff0c;且供应用层访问的接口已在.h 文件中定义&#xff0c;此时&#xff0c;NAPI 接口开…

OpenHarmony无人机MAVSDK开源库适配方案分享

MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK&#xff0c;支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议&#xff0c;用于与无人机&#xff08;以及机载无…

目标检测评价标准

主要借鉴&#xff1a;https://github.com/rafaelpadilla/Object-Detection-Metrics?tabreadme-ov-file 主要评价指标、术语&#xff1a; Intersection Over Union (IOU)&#xff1a;两个检测框交集面积与并集面积的比值 True Positive (TP)&#xff1a;IOU大于阈值的检测框…

计算机网络——30SDN控制平面

SDN控制平面 SDN架构 数据平面交换机 快速、简单&#xff0c;商业化交换设备采用硬件实现通用转发功能流表被控制器计算和安装基于南向API&#xff0c;SDN控制器访问基于流的交换机 定义了哪些可以被控制哪些不能 也定义了和控制器的协议 SDN控制器&#xff08;网络OS&#…

计算机基础系列 —— 虚拟机代码翻译器(1)

“Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.” ―Linus Torvalds 文中提到的所有实现都可以参考&#xff1a;nand2tetris_sol&#xff0c;但是最好还是自己学习课程实现一…

Spring Cloud GateWay——网关的基本使用

1. 为什么所有的请求先到网关呢&#xff1f; 有了网关就可以对请求进行路由&#xff0c;路由到具体的微服务&#xff0c;减少外界对接微服务的成本&#xff0c;比如&#xff1a;400电话&#xff0c;路由的试可以根据请求路径进行路由、根据host地址进行路由等&#xff0c; 当微…