Java-Secruity-2

 可以先看这篇文章

Secruity-1👈

1、授权

1.1 权限管理

在日常使用的系统中都会涉及到权限相关的操作,管理员有管理员的操作,用户有用户的操作,不同的用户可以使用不同的功能,这需要使用到权限管理。

所以在写接口的时候需要在后台进行用户权限的判断,判断当前用户是否有相应的权限,必须具有所需权限才能进行相应的操作。

image-20221104151126316

RBAC权限模型

user表

menu表

role表

role_menu表

user_role表
 sql语句

通过user_id关联user_role得到用户的role_id

通过role_id关联role得到角色对应的信息

通过role_id关联role_menu得到menu_id

通过menu_id关联menu得到权限的具体信息

2.2 授权实现

2.2.1 设置资源权限

  • 启动类开启配置
    @EnableGlobalMethodSecurity(prePostEnabled = true)
  • 注解配置
    @RequestMapping
    // 设置这个接口需要system:class:list权限,这个可以在数据库的sys_menu中查找
    @PreAuthorize("hasAnyAuthority('在数据库设置的权限标识')")
    public String queryAll() {System.out.println("queryAll");return "user";
    }
    重写LoginUser里的getAuthorities
  • // 存储每个用户的权限信息private List<String> permissions;@JsonIgnore// 不手动添加的话后去反序列化会出现异常/*authorities用于在底下的getAuthorities返回登入成功后,会把用户信息存在redis里java的数据是以对象的形式表示redis的数据表示格式和java不一样,需要进行数据格式的转化*/// 权限集合需要转换成这种类型的Security才能判断List<GrantedAuthority> authorities = new ArrayList<>();@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {//现在要做的就是把上面定义的authorities放入每个用户的权限信息for(String permission:permissions) {authorities.add(new SimpleGrantedAuthority(permission));}return authorities;}
    mapper
  • public interface UserMapper extends BaseMapper<MsUser> {List<String> getPermissions(Long userId);}
    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.example.demo.mapper.UserMapper"><select id="getPermissions" resultType="string">SELECT t5.key FROM user t1JOIN user_role t2 on t1.id = t2.user_idJOIN role t3 ON t3.role_id = t2.role_idJOIN role_menu t4 ON t4.role_id = t3.role_idJOIN menu t5 ON t5.menu_id = t4.menu_idWHERE t1.id = #{userId}</select></mapper>
    
    UserDetailsServiceImpl中获取权限信息
  • // 重写了UserDetailsService,控制台就没有打印生成的密码。因为我们自定义了登录流程
    @Service
    public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate IUserService userService;@Autowiredprivate UserMapper userMapper;// UserDetails: security存放登录用户信息@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {System.out.println("loadUserByUsername");LambdaQueryWrapper<MsUser> qw = new LambdaQueryWrapper<>();qw.eq(MsUser::getUsername, username);// 根据账号查询用户信息MsUser msUser = userService.getOne(qw);// TODO: 统一处理异常if(msUser == null) {throw new RuntimeException("账号不存在");}LoginUser loginUser = new LoginUser();loginUser.setMsUser(msUser);//这里底下是登录成功要做的事// 获取权限信息List<String> permissions = userMapper.getPermissions(msUser.getId());// 将权限信息装到loginUser对象loginUser.setPermissions(permissions);return loginUser;}}
    
    自定义权限校验
  • @Component("ss")
    //类名方法名怎么定义都行
    public class MyExpressionUtil {//判断当前用户有没有当前方法上的标识public boolean myAuthority(String key) {//SecurityContextHolder.getContext()获取用户信息// 获取用户的权限列表Authentication authentication = SecurityContextHolder.getContext().getAuthentication();// 获取到登录的用户LoginUser loginUser = (LoginUser) authentication.getPrincipal();// 拿到该用户的权限List<String> permissions = loginUser.getPermissions();return permissions.contains(key);}
    控制层的方法上加上注解
  •  @GetMapping("/test1")@PreAuthorize("@ss.myAuthority('t1')")public String test1() {System.out.println("test1");return "test1";}

    3.1 简介

    前面写的接口,如果有错误异常等,前端看不见也不知道什么问题,所以一般会做一个统一的错误处理,可以使用SpringSecurity的异常处理机制。

    在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。

    如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

    如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

    所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPointAccessDeniedHandler然后配置给SpringSecurity即可。

统一返回数据Result 

@Data
public class R<T> {private String msg;private Integer code;private T data;public R() {}public R(String msg, Integer code, T data) {this.msg = msg;this.code = code;this.data = data;}public static R success() {return new R("操作成功!!", 200, null);}public static <T> R success(T data) {return new R("操作成功!!", 200, data);}public static R error() {return new R("操作失败!!", 500, null);}public static R error(String msg, Integer code) {return new R(msg, code, null);}public static R to(int rs) {return rs > 0 ? R.success() : R.error();}}

捕捉认证失败

//捕捉认证过程出现的异常(token异常)
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setContentType("application/json;charset=utf8");response.getWriter().write(JSON.toJSONString(R.error("认证失败", 401)));}
}

捕捉授权失败

//捕捉授权失败的异常(权限异常)
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {response.setContentType("application/json;charset=utf8");response.getWriter().write(JSON.toJSONString(R.error("没有权限", 403)));}
}
3.3 配置给SpringSecurity

修改configure方法(Security配置的过滤器都要加到这里)

@Autowired
private AuthenticationEntryPointImpl authenticationEntryPoint;
@Autowired
private AccessDeniedHandlerImpl accessDeniedHandler;
​
// 配置异常处理器
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).accessDeniedHandler(accessDeniedHandler);

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

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

相关文章

μC/OS-III 里面的环形表

文章目录 1、时钟节拍任务2、定时器列表 μC/OS-III 里面两个地方用到了环形表&#xff0c;时钟节拍任务&#xff0c;定时器列表&#xff0c;通过排序后&#xff0c;效率是非常高的。 以下内容整理自 嵌入式实时操作系统uC/OS-Ⅲ 1、时钟节拍任务 2023/12/21 18:04:16 (1) 该…

【数论】约数

试除法求约数 时间复杂度 O(sqrt(n))。 核心思路是求到较小的约数时&#xff0c;将其对应的较大约数也可以直接求出来&#xff0c; 例如&#xff1a;a/bc&#xff0c;b是a的余数&#xff0c;c也是a的余数 ps&#xff1a;注意bc的情况&#xff0c;要注意去重 void solve() …

JavaGUI(但期末速成版)之事件监听和处理

点击返回标题->JavaGUI期末速成版-CSDN博客 前言 依旧先声明&#xff0c;本篇记录的JavaGUI编程都是十分精简的&#xff0c;内容只取常用的、套路的、应付期末考试的。 我先放两张ppt的原内容。。。 看完&#xff08;我觉得你可能都没看完&#xff09;&#xff0c;摊牌了&a…

赴日IT培训课程 程序员新思路!

先说好&#xff0c;跟国内相比&#xff0c;日本IT并不发达。日本IT是依托着日本传统强势的制造业和政府机关发展的&#xff0c;所以开发的大多数软件也是面向这些的&#xff0c;由于日本人的严谨态度&#xff0c;各种文档的编写层出不穷&#xff0c;不像国内程序员每天没日没夜…

android 新版studio gradle 里面没有offline 勾选项

studio 右边 gradle 上面有个图标可以点击切换

【深度学习】注意力机制(七)Agent Attention

本文介绍Agent Attention注意力机制&#xff0c;Transformer中的Attention模块可以提取全局语义信息&#xff0c;但是计算量太大&#xff0c;Agent Attention是一种计算非常有效的Attention模块。 论文&#xff1a;Agent Attention: On the Integration of Softmax and Linear…

前端手动部署与自动化部署

连接服务器 先购买服务器 安装vscode插件 连接服务器 连接成功 手动部署 安装nginx 启动nginx systemctl start nginx systemctl status nginx systemctl enable nginx启动 检查状态 开机就启动nginx 开始手动部署 配置nginx 成功

走过的2023:在挑战中领悟,在仿徨中成长

转眼间就到了2023年的最后一个月&#xff0c;回顾这短暂而又有意义的一年&#xff0c;可以用12个字总结&#xff1a;在挑战中领悟&#xff0c;在仿徨中成长。这篇文章我会从技术成长、职场生活、读书感悟和个人生活等几个方面&#xff0c;总结一下过去的这一年&#xff0c;梳理…

【玩转TableAgent数据智能分析】——个人体验分享

文章目录 前言上手体验优势不足 再次体验第三次体验第四次体验1、找到高价房源和低价房源的特点&#xff0c;看清民宿行业的整体布局2、了解各个地域的整体价格&#xff0c;优选潜力城市3、对比各个城市的评分&#xff0c;深入了解不同城市的民宿市场特点4、对比不同床型价格&a…

Java AQS 阻塞式锁和相关同步器工具的框架

8 J.U.C Java 并发工具包 AQS 原理 AQS&#xff1a;AbstractQueuedSynchronizer&#xff08;抽象队列同步器&#xff09;&#xff0c;阻塞式锁和相关同步器工具的框架 特点&#xff1a; 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#…

TCP/IP 传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP&#xff08;Transmission Control Protocol&#xff09;和用户数据包协议UDP&#xff08;User Datagram Protocol&#xff09;。 TCP协议 TCP是一种面向连接的传输层协议&#…

esp32-s3解决使用蓝牙ble一键配网时,蓝牙ble内存使用的内部空间,空间不足时可采用外部PSRAM

idf.py menuconfig进入到esp32配置界面&#xff0c;配置NimBLE使用外部PSRAM内存即可

pip 离线安装:利用pypi网站进行模块 库的离线安装

离线安装是一种很好的方法&#xff0c;在网络不佳、库版本不明确、复杂库本地编译安装报错时&#xff0c;通过whl文件的下载安装&#xff0c;可以很高效的解决问题。 pypi的网站&#xff1a;https://pypi.org/ 这个网站包含各种你 pip install xxx 的库&#xff0c;离线安装可…

我做了一个在手机灵动岛锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率...的软件

我做了一个在手机灵动岛&锁屏看实时网速/步数/下班倒计时/跑步距离/照片/待办/倒计时/手机使用次数/帧率…的软件 Island Widgets 的作用&#xff1a; 提醒您 &#xff1a; 准时下班每天运动陪伴家人保持体重放下手机每日待办当前网速手机使用强度实时热搜现在天气… 初…

Python库学习(十三):爬虫框架Scrapy

微信搜索【猿码记】查看更多文章... 1.介绍 Scrapy是一个用于爬取网站数据的Python框架。它提供了一套强大而灵活的工具&#xff0c;使开发者能够轻松地创建和管理爬虫&#xff0c;从而从网站中提取所需的信息。框架要求Python的版本 3.8 Github Star:49.6k: https://github.c…

【Linux】Linux线程概念和线程控制

文章目录 一、Linux线程概念1.什么是线程2.线程的优缺点3.线程异常4.线程用途5.Linux进程VS线程 二、线程控制1.线程创建2.线程终止3.线程等待4.线程分离 一、Linux线程概念 1.什么是线程 线程是进程内的一个执行流。 我们知道&#xff0c;一个进程会有对应的PCB&#xff0c;…

GEE-Sentinel-2月度时间序列数据合成并导出

系列文章目录 第一章&#xff1a;时间序列数据合成 文章目录 系列文章目录前言时间序列数据合成总结 前言 利用每个月可获取植被指数数据取均值&#xff0c;合成月度平均植被指数&#xff0c;然后将12个月中的数据合成一个12波段的时间数据合成数据。 时间序列数据合成 代码…

ROS2 学习09--ros 中的通信接口的定义以及如何创建自定义msg、srv和action文件

在ROS系统中&#xff0c;无论话题还是服务&#xff0c;或者我们后续将要学习的动作&#xff0c;都会用到一个重要的概念——通信接口。 通信并不是一个人自言自语&#xff0c;而是两个甚至更多个人&#xff0c;你来我往的交流&#xff0c;交流的内容是什么呢&#xff1f;为了让…

数值分析(只为应付考试)

概述 研一时为应付高等工程数学考试整理的有关数值分析部分的内容&#xff0c;目的是为了应付考试。 误差 误差限与有效数字的联系 对于有 n n n 位有效数字的 x x x 的近似值 x ∗ x^* x∗, 其科学计数法表示形式 x ∗ a 1 . a 2 . . . a n 1 0 m ( a 1 ≠ 0 ) x^* …

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer)

Python开发GUI常用库PyQt6和PySide6介绍之二&#xff1a;设计师&#xff08;Designer&#xff09; PySide6和PyQt6都有自己的设计师&#xff08;Designer&#xff09;&#xff0c;用于可视化地设计和布局GUI应用程序的界面。这些设计师提供了丰富的工具和功能&#xff0c;使开…