springsecurity最基础的授权过程

news2024/12/26 12:01:33

在这里插入图片描述
​ 在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。

​ 所以我们在项目中只需要把当前登录用户的权限信息也存Authentication,然后设置我们的资源所需要的权限即可。

想开启授权,首先SecurityConfig配置类上加上该条注释

@EnableGlobalMethodSecurity(prePostEnabled = true)

然后在需要控制的接口上加入注释

//参数就为自己像设置的权限
    @PreAuthorize("hasAuthority('test')")

我们靠最开始实现 UserDetailsLoginUser类中实现的方法返回权限

@Data
@NoArgsConstructor
public class LoginUser implements UserDetails {

   private User user;

   //重写的UserDetailsServiceImpl中不仅要返回用户基本信息,还要返回权限信息
   private List<String> permissions;

   @JSONField(serialize = false)  //SimpleGrantedAuthority是由spring管理,我们会把LoginUser存入redis中,则redis不会序列化SimpleGrantedAuthority
                                  //则我们不把该对象存入到redis中,则加入该注释
   private List<SimpleGrantedAuthority> authorities;

   public LoginUser(User user,List<String> permissions){
       this.user = user;
       this.permissions = permissions;
   }

   //springSecurity中权限信息是通过重写该方法传递出去
   @Override
   public Collection<? extends GrantedAuthority> getAuthorities() {
       //已进入就有权限信息,则不需要再去数据库访问一次了
       if(authorities!=null){
           return  authorities;
       }
       //把permission中String类型的权限信息封装成SimpleGrantedAuthority对象
       authorities = new ArrayList<>();
       for(String permission : permissions){
           SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permission);
           authorities.add(authority);
       }
       return authorities;
   }

   @Override
   public String getPassword() {
       return user.getPassword();
   }

   @Override
   public String getUsername() {
       return user.getUserName();
   }

   @Override
   public boolean isAccountNonExpired() {
       return true;
   }

   @Override
   public boolean isAccountNonLocked() {
       return true;
   }

   @Override
   public boolean isCredentialsNonExpired() {
       return true;
   }

   @Override
   public boolean isEnabled() {
       return true;
   }
}

然后在从数据库那用户数据的地方再拿权限信息即可(该代码中只是随便给了一个list,没有从数据库中拿值)

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
   @Autowired
   private UserMapper userMapper;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

       LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
       queryWrapper.eq(User::getUserName,username);
       User user =userMapper.selectOne(queryWrapper);
       if(Objects.isNull(user)){
           throw new RuntimeException("用户名或者密码错误");
       }

       //todo 封装权限信息
       List<String> list = new ArrayList<>(Arrays.asList("test","admin"));

       //数据返回UserDetails类型,把数据封装成UserDetails类型 但UserDetails是接口,则利用一个UserDetails的实现类,我们自己写一个实现类去实现该接口就行,重写里面的方法
       return new LoginUser(user,list);

   }
}

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

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

相关文章

【JAVA八股文】JVM虚拟机相关

JVM虚拟机相关1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalize1. JVM 内存结构 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码执行 java 命令 创建 JVM&#xff0c;调用类加载子系统加载 class&#xf…

使用 ChatGPT 、Stable Diffuison、React和NodeJS构建网站图库

本文译者为360奇舞团前端开发工程师原文标题&#xff1a;Building a website gallery with ChatGPT, Stable Diffusion, React and NodeJS原文作者&#xff1a;Nevo David原文地址&#xff1a;https://javascript.plainenglish.io/building-a-website-gallery-with-chatgpt-sta…

Apollo Planning规划算法仿真调试(15):使用Vscode断点调试apollo的方法更新版

前言 使用Vscode断点调试apollo的方法之前在该专栏写过一篇分享,后台很多粉丝留言希望写的更详细一点,所以更新一版,尽量将配置过程详细描述,并且附上完整的配置文档。 Vscode 作为轻量化的调试工具深受广大开发者的青睐,虽然大家都用它来看新闻逛论坛炒股,但是用它开发…

【郭东白架构课 模块一:生存法则】01|模块导学:是什么在影响架构活动的成败?

你好&#xff0c;我是郭东白。这节课是我们模块一的导入部分&#xff0c;我会先来介绍模块的主要内容&#xff0c;以及为什么我要讲生存法则这个话题。 一名软件架构师要为相对复杂的业务制定&#xff0c;并且引导实施一个结构化的软件方案。这个发现最终方案和推动实施的过程&…

智加科技上市箭在弦上,头部自动驾驶技术企业何去何从?

/ 导读 /受禾赛科技美股上市成功的影响&#xff0c;中国商用车自动驾驶技术公司智加科技也传出了即将拆分在美股上市的消息。其中&#xff0c;智加科技的中国部分据传将被满帮收购&#xff0c;并且将并入自动驾驶卡车公司挚途科技。至于美国部分&#xff0c;将寻求独立上市。对…

python切片总算搞明白了

不会python已久矣&#xff01; 简单切片 简单切片指的是这样的切片形式&#xff1a;a[start:stop]&#xff0c; 左闭右开 负索引可以直接代表那个值 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[2:3][2]>>> a[5:9][5, 6, 7, 8]>>> a[5…

电商导购CPS,拼多多(多多进宝)如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…

Cortex-M0中断控制和系统控制

目录1.NVIC和系统控制块特性2.中断使能和清除使能3.中断挂起和清除挂起4.中断优先级5.中断控制的通用汇编代码使能和禁止中断设置和清除中断挂起状态设置中断优先级6.异常屏蔽寄存器&#xff08;PRIMASK&#xff09;7.中断输入和挂起行为8.中断等待9.系统异常的控制寄存器10.系…

JuiceFS 在火山引擎边缘计算的应用实践

火山引擎边缘云是以云计算基础技术和边缘异构算力结合网络为基础&#xff0c;构建在边缘大规模基础设施之上的云计算服务&#xff0c;形成以边缘位置的计算、网络、存储、安全、智能为核心能力的新一代分布式云计算解决方案。边缘存储主要面向适配边缘计算的典型业务场景&#…

Python seek()和tell()函数详解

在讲解 seek() 函数和 tell() 函数之前&#xff0c;首先来了解一下什么是文件指针。我们知道&#xff0c;使用 open() 函数打开文件并读取文件中的内容时&#xff0c;总是会从文件的第一个字符&#xff08;字节&#xff09;开始读起。那么&#xff0c;有没有办法可以自定指定读…

分布式事务实现机制及二阶段提交

注&#xff1a;本文章引自终于把分布式事务讲明白了&#xff01; 分布式事务 分布式事务是指在分布式环境下事务&#xff0c;一个事务由多个数据库节点共同完成。分布式事务也必须要保证事务的ACID的特性。 实现分布式事务原子性的通常做法就是采用两阶段提交协议&#xff0c…

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

查看数据是否为空: train.isnull().sum()查看特征元素: train[StateHoliday].unique() # array([0, a, b, c], dtypeobject)绘制热力图: sns.heatmap(df_train.corr(),cmap RdYlGn_r,annotTrue,vmin -1,vmax1)合并商店信息和销售数据: train pd.merge(train, store, on …

高校房产管理系统有哪些管理功能范围?

数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。…

世界上最健康的程序员作息表!「值得一看」

昨晚看了一篇“传说中”的“世界上最健康的作息时间表”&#xff0c;开始纠结自己还要不要5点半起床。 都说程序员这一行&#xff0c;猝死概率极高&#xff0c;究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章&#xff0c;还是非常值得参考的&#…

基于Java+SpringBoot+Vue+Uniapp前后端分离商城系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

PyQt5 界面预览工具

简介 一款为了预览PyQt5设计的UI界面而开发的工具&#xff0c;使用时需要结合PyCharm同时使用。 下载 PyQt5界面预览工具 参数说明 使用配置 启动PyCharm&#xff0c;找到File -> Settings&#xff0c;打开 找到Tools -> External Tools点击打开&#xff0c;在新界面…

GuLi商城-SpringCloud Alibaba-Nacos注册中心

简介&#xff1a; Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是构建以 “服务” 为中心的现代应用架构 (例 如微服务范式、云原生范式) 的服务基础设施。致力于服务发现、配置和管理&#xff0c;且提供了一组简单 易用的特性集。让微服务的发现…

GEE学习笔记 八十一:【GEE之Python版教程十二】

这一节介绍一下日期类&#xff0c;那么GEE基础的类型基本上介绍完成。后续开始介绍GEE在遥感GIS处理上的一些API内容&#xff0c;比如矢量数据、栅格数据处理等。 这段代码是在程序之前必须执行的&#xff0c;用来注册GEE。 import ee ee.Initialize() 1、日期类API 首先看一…

C语言-文件操作-10

题目&#xff1a; 修改下列程序&#xff0c;用命令行界面代替交互式界面 #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFSIZE 4096 #define SLEN 81 void append(FILE * source,FILE * dest); char * s_gets(char * st,int n); i…

Spring3定时任务

简介 Spring 内部有一个 task 是 Spring 自带的一个设定时间自动任务调度&#xff0c;提供了两种方式进行配置&#xff0c;一种是注解的方式&#xff0c;而另外一种就是 XML 配置方式了;注解方式比较简洁&#xff0c;XML 配置方式相对而言有些繁琐&#xff0c;但是应用场景的不…