SpringSecurity_day3_授权管理

news2024/9/20 16:49:55

SpringSecurity和JWT

SpingSecurity用于保护web安全,实现访问控制的功能,身份认证和授权操作,账号密码校验,使用token授权

JWT:可以实现跨域身份验证和授权,安全和方便

在这里插入图片描述

集成授权的操作流程

1.重写UserDetails中的方法getAuthorities

2.查询当前用户所有的权限信息,并返回GrantedAuthority类型的集合,在mapper接口做查询

​ 手动获取容器中的mapper

​ 手动使用**SpringUtils.getBean(PermissionMapper.class)**获取到对象

PermissionMapper mapper = SpringUtils.getBean(PermissionMapper.class);

​ 判断当前用户是不是超管

​ 是超管就分配所有的权限

List<Permission> permissions = mapper.selectAll();
ArrayList<SimpleGrantedAuthority> list = new ArrayList<>();

​ 将权限表达式封装成SpringSecurity需要的对象,并进行返回

for (Permission permission : permissions) {
    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permission.getExpression());
    list.add(authority);
}

​ 不是超管就分配应有的权限,使用用户的id去数据库查询权限信息,使用java8的方式将数据封装成SpringSecurity这样的对象

List<String> expressions = mapper.selectExpressionsByEmpId(employee.getId());
return expressions.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());

3.在filter中认证的时候在UsernamePasswordAuthenticationToken中加入权限

在这里插入图片描述

4.使用注解开启注解支持

在这里插入图片描述

5.在需要权限的方法上贴@PreAuthorize(“hasAuthority(‘department:list’)”)注解

问题

由于这里使用的动态代理的代理类拿的注解,但是代理类是没有那个注解的,需要拿到父类的字节码对象才能得到这个注解,在权限的Service中进行修改

在这里插入图片描述

虽然是管理员,但是没有权限做任何操作

出现的原因,将前端传进来的userId可能写成id,会导致接收的参数不会对应

JWT

定义了紧凑的,自包含的方式,使用JSON对象安全传输的信息

使用session认证缺点

1.每做一次认证都会在内存中作一次记录,用户增多后的服务端的开销较大

2.会使用明文进行信息的展示,不安全

使用JWT的优势:

​ 自包含: 负载中包含了所有的用户所需要的新信息

​ 简洁: 数据量少,传输速度快

​ 好处:不以明文的形式保存在浏览器

结构

标头(header):

​ 定义令牌的类型和所使用的签名算法类型

载荷(payload)

​ 加密用户和其他的数据

签名(signature):

​ 保护JWT没有被篡改过,是一个盐

如何集成JWT

1.使用工具类JWTUtils

2.在spplication.yml写配置

jwt:
  scret: abced
  head: Authencation

3.在sEmployeeService中使用JWT生成token,并且此时方法的返回的类型改成String

//使用JWT生成token,此时这个方法返回的类型就从Employee改成String
String uuid = UUID.randomUUID().toString();
String toten = jwtUtils.createToken("uuid", uuid);

// 将登录成功之后的用户对象存到redis中
redisUtils.set("EMPLOYEE:"+uuid, JSON.toJSONString(employee), 60*60*24);

4.在过滤器中增加JWT

​ 使用**jwtUtils.getHeade()**获取前端传进来的令牌,同时修改前端参数的获取

String token1 = httpServletRequest.getHeader(jwtUtils.getHead());

​ 判断token中是否有值,有值就获取令牌中的uuid,用这个获取redis中的数据

if(StringUtils.hasLength(token1)){
    //获取令牌中的uuid,用这个取获取redis中的数据
    String uuid = jwtUtils.getToken1(token1, "uuid");
    String employeeJson = redisUtils.get("EMPLOYEE:" + uuid);
     //将认证后的信息对象添加到上下文对象中,供认证检查时使用
            Employee employee = JSON.parseObject(employeeJson, Employee.class);
            if(employee!=null){
                MyUserDetails myUserDetails = new MyUserDetails();
                myUserDetails.setEmployee(employee);
                UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(employee.getUsername(), employee.getPassword(),myUserDetails.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(token);
            }
JWT中的数据被篡改会有以下的错误,

在这里插入图片描述

导包错误,导spring的,同时交给统一异常处理
在这里插入图片描述

回顾

如何做认证

如何做授权

认证和授权的底层原理(先看)

横向看shiro,看底层原理

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

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

相关文章

科技项目验收测试报告有什么注意事项和疑惑?

科技项目验收测试报告是一份重要的文件&#xff0c;用于评估科技项目的质量和可靠性&#xff0c;对项目的成功交付具有关键作用。在项目完成的最后阶段&#xff0c;通过对项目进行全面测试和评估&#xff0c;以确保项目符合预期的目标和需求&#xff0c;并满足用户的期望。 一…

π221N61 低功耗5.0kVrms 双向I²C隔离器 兼容Si8602AD-B-IS

π221N61荣湃深力科兼容IC接口的低功耗双 向隔离器&#xff0c;IC隔离器输入和输出采用二氧化硅(SiO2) 介质隔离&#xff0c;可阻断高电压并防止噪声电流进入控制侧&#xff0c;避 免电路干扰和损坏敏感器件。π221N61 是基于荣湃智能分压专利技术设计 的产品&#xff0c;与光电…

环卫工人儿子高考687分被多校争抢 父亲:就算贷款、卖房也会让他读下去

大家好&#xff01;我是老洪。 今天一早看到一则资讯。 广州一名环卫工人的儿子高考取得了687分的优异成绩&#xff0c;考入了上海交通大学。 真优秀。 据报道&#xff0c;清华大学、浙江大学、复旦大学、中科大等多所中国知名高校都曾亲自打电话向这位环卫父亲的儿子表示祝贺并…

【MySQL】不允许你不会使用子查询

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

Web_php_unserialize

源码解析 依旧是反序化漏洞&#xff0c;本源码定义了一个Demo的类&#xff0c;里包含了__construct、__destruct()、__wakeup三个方法 简介&#xff1a; __construct()方法是在创建对象时&#xff0c;调用赋初值 __destruct()方法是在对象不再使用时自动调用&#xff0c;这里的…

Jest单元测试Vue项目实践

​ 做单元测试的优点&#xff1a; 1.减少bug避免低级错误 2.提高代码运行质量 3.快速定位问题 4.减少调试时间&#xff0c;提高开发效率 5.便于重构 Jest安装&#xff1a; npm install babel-jest jest jest-serializer-vue vue/test-utils vue/cli-plugin-unit-jest -D…

好用到飞起的新项目「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 虽然本周 GitHub 热榜都是一些熟悉的面孔&#xff0c;但还是有不少新开源的项目&#xff0c;比如受启发于 Stripe IDs 的 UUIDv7 扩展 typeid&#xff0c;相信有了它&#xff0c;数据标识问题就迎刃而解了。此外&#xff0c;还有刚开源就获…

Linux--自动化的构建项目:make、Makefile

make是一个命令 Makefile是一个文件 Makefile的构成&#xff1a; ①依赖关系 ②依赖方法 编写Malefile文件的最终目标是生成项目&#xff0c;换句话说就是&#xff0c;想让Makefile把我的源代码编译&#xff0c;自动形成可执行文件 示例&#xff1a; 注&#xff1a;.PHONY…

c++11 标准模板(STL)(std::basic_ostream)(五)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

C++动态库使用

个人博客地址: https://cxx001.gitee.io 前言 Windows与Linux下面的动态链接库区别 1. 文件后缀不同 Linux动态库的后缀是 .so 文件&#xff0c;而window则是 .dll 文件。 2. 文件格式不同 &#xff08;a&#xff09;Linux下是ELF格式&#xff0c;即Executable and Linkab…

数据结构--字符串的朴素模式匹配算法

数据结构–字符串的朴素模式匹配算法 主串&#xff1a; \color{purple}主串&#xff1a; 主串&#xff1a; ‘嘿嘿嘿红红火火恍恍惚惚嗨皮开森猴开森 笑出猪叫 \color{red}笑出猪叫 笑出猪叫哈哈哈哈嗨森哈哈哈哈哈哈嗝’ 模式串&#xff1a; \color{purple}模式串&#xff1a…

计算机毕业论文内容参考|基于Python的城乡低保信息管理系统的设计和实现

文章目录 导文摘要课题背景国内外现状与趋势课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的城乡低保信息管理系统的设计和实现 摘要 本文介绍了基于Python的城乡低保信息管理系统的设…

【电路原理学习笔记】第2章:电压、电流和电阻:2.2 电荷

第2章&#xff1a;电压、电流和电阻 2.2 电荷 电子是最小的带负电荷的粒子。当物质中存在过量的电子时&#xff0c;该物质就带负的电荷&#xff1b;当电子不足时&#xff0c;就带正的净电荷。电子和质子的电荷量相等&#xff0c;但极性相反。 电荷&#xff1a;电荷是由于物质…

企业电子名片小程序哪家?市面上哪一款名片小程序更好用?

市面上名片小程序很多&#xff0c;但是选择一款真正好用的功能强大的小程序名片就不是很多&#xff0c; 推荐你看看开利网络的链企来名片功能&#xff0c;不但具有人物的基础信息&#xff0c;还有云展厅可以上传企业信息展示企业&#xff0c;链接打通了活动&#xff0c;展会&am…

7DGroup性能实施项目日记9

好多天没写实施日记了&#xff0c;这段时间&#xff0c;我也有些其他事情要做&#xff0c;因为前阵子答应了写些东西&#xff0c;所以这几天晚上弄到两三点&#xff0c;终于写完了五万字的东西交了差。 这一段时间是培训的课程关键内容&#xff0c;基本都是分析的关键环节。主…

2023年6月NISP一级线上考试成绩发布

作为计算机行业的在校生&#xff0c;掌握更多专业知识&#xff0c;取得更有价值更有竞争力的证书&#xff0c;既能丰富自身专业知识的储备&#xff0c;又能增加毕业后就业应聘的砝码&#xff0c;早日行动&#xff0c;早日脱颖而出。 6月&#xff0c;恭喜以下同学喜提 中国信息…

Mac OS 配置java的环境变量

Mac OS 配置java的环境变量 下载java的jdk安装包 下载完成后&#xff0c;点击安装&#xff0c;一直下一步即可。Mac会默认安装到:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk&#xff0c;commandoptionc复制路径 打开terminal&#xff0c;运行如下命令&#xff1a; 创建…

Qt6.5 LTS Windows使用VS2019编译全过程【包含静态编译】

Qt6.5 LTS Windows使用VS2019编译 目的编译主机环境编译依赖项方式1、 使用自定义.bat脚本编译编写脚本编译使用示例 方式2、使用官方configue脚本进行编译 目的 鉴于之前一直使用的是Qt5&#xff0c;现在Qt6已经出到Qt6.6了&#xff0c;弄个Qt6尝尝鲜吧&#xff0c;但是从Qt5…

某中厂面试题分享(附详细答案解析)

前言&#xff1a; 本篇文章主要记录上周某中厂面试题的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601; 以下正文开始 文章目…

【性能工程】性能比较:REST vs gRPC vs 异步通信

微服务之间的通信方式对微服务架构内的各种软件质量因素有重大影响&#xff08;有关微服务网络内通信的关键作用的更多信息&#xff09;。沟通方式会影响软件的性能和效率等功能性需求&#xff0c;以及可变性、可扩展性和可维护性等非功能性需求。因此&#xff0c;有必要考虑不…