【Spring Security + OAuth2】授权

Spring Security + OAuth2

第一章 Spring Security 快速入门
第二章 Spring Security 自定义配置
第三章 Spring Security 前后端分离配置
第四章 Spring Security 身份认证
第五章 Spring Security 授权
第六章 OAuth2


文章目录

  • Spring Security + OAuth2
  • 1、基于request的授权
    • 1.1、用户-权限-资源
      • 需求
      • 配置权限
      • 授权权限
      • 请求未授权的接口
    • 1.2、用户-角色-资源
      • 配置角色
      • 授权角色
    • 1.3、用户-角色-权限-资源
  • 2、基于方法的授权
    • 2.1、开启方法授权
    • 2.2、给用户授予角色和权限
    • 2.3、常用授权注解


授权管理的实现在SpringSecurity中非常灵活,可以帮助应用程序实现以下两种常见的授权需求:

  • 用户-权限-资源:例如张三的权限是添加用户、查看用户列表、李四的权限是查看用户列表
  • 用户-角色-权限-资源:例如张三是角色是管理员、李四的角色是普通用户,管理员能做所有操作,普通用户只能查看信息

1、基于request的授权

1.1、用户-权限-资源

需求

  • 具有USER_LIST权限的用户可以访问/user/list
  • 具有USER_ADD权限的用户可以访问/user/add

配置权限

SecurityFilterChain

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// authorizeHttpRequests() 开启授权保护// anyRequest() 对所以请求开启授权保护// authenticated()已认证请求会自动授权。http.authorizeHttpRequests(authorize -> authorize//具有USER_LIST权限的用户可以访问/user/list                   .requestMatchers("/user/list").hasAnyAuthority("USER_LIST")//具有USER_ADD权限的用户可以访问/user/addd.requestMatchers("/user/add").hasAnyAuthority("USER_ADD")//对所有请求开启授权保护.anyRequest()//已认证的请求会被自动授权.authenticated());...
}

授权权限

DBUserDetailsManager中的loadUserByUsername方法:

 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{Collection<GrantedAuthority> authorities = new ArrayList<>();//模拟权限authorities.add(()->"USER_LIST");authorities.add(()->"USER_ADD");return   new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getEnabled(),true,//用户账号是否过期。true,//用户凭证是否过期true,//未被锁定authorities//权限列表);}}

请求未授权的接口

实现AccessDeniedHandler 接口

package com.security.demo.config;public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException {//创建结果对象HashMap result = new HashMap();result.put("code",-1);result.put("message","没有权限");//转换成json字符串String json = JSON.toJSONString(result);//返回响应response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);}
}

SecurityFilterChain添加配置请求未授权的处理。

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {...http.exceptionHandling(exception -> {exception.accessDeniedHandler(new MyAccessDeniedHandler());//请求未授权的处理});...
}

1.2、用户-角色-资源

配置角色

package com.security.demo.config;
import ...@Configuration //配置类
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").hasRole("ADMIN").anyRequest().authenticated());...
}

授权角色

@Component
public class DBUserDetailsManager implements UserDetailsManager, UserDetailsPasswordService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{//模拟授权return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用户是否禁用.credentialsExpired(false)//是否过期.accountLocked(false).roles("ADMIN").build();}}
}

1.3、用户-角色-权限-资源

RBAC(Role-Based Access Control,基于角色的访问控制)是一种常用的数据设计方案,它将用户的权限分配和管理与角色相关联。以下是一个基本的RBAC数据库设计方案的示例:

1、用户表(User table):包含用户的基本信息,例如用户名、密码和其他身份验证信息。

列名数据类型描述
user_idint用户ID
usernamevarchar用户名
passwordvarchar密码
emailvarchar电子邮件

2、角色表(Role table):储存所有可能得角色及其描述。

列名数据类型描述
role_idint角色ID
role_namevarchar角色名称
descriptionvarchar角色描述

3、权限表(Permission table):定义系统中所有可能得权限

列名数据类型描述
permission_idint权限ID
permission_namevarchar权限名称
descriptionvarchar角色描述

4、用户角色关联表(User-Role table):将用户与角色关联起来。

列名数据类型描述
user_role_idint用户角色关联ID
user_idint用户ID
role_idint角色ID

5、角色权限关联表(Role-Permission table):将角色与权限关联起来。

列名数据类型描述
role_permission_idint用户角色关联ID
role_idint角色ID
permission_idint权限ID

在这个设计方案中,用户可以被分配一个或多个角色,而每个角色又可以具有一个或多个权限。通过对用户角色关联和角色权限关联表进行操作,可以实现灵活的权限管理和访问控制。

2、基于方法的授权

2.1、开启方法授权

在配置文件中添加@EnableMethodSecurity注解,并修改authorizeHttpRequests

@Configuration //配置类
@EnableMethodSecurity
public class WebSecurityConfig {...http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
}

2.2、给用户授予角色和权限

DBUserDetailsManager中的loadUserByUsername方法:

	 return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用户是否禁用.credentialsExpired(false)//是否过期.accountLocked(false).roles("ADMIN")//authorities和roles不能同时使用会覆盖.authorities("USER_ADD","USER_LIST").build();}

2.3、常用授权注解

    @GetMapping(path = "/list")@PreAuthorize("hasRole('ADMIN') and authentication.name == 'abc'")public List<User> getList(){return userService.list();}@PreAuthorize("hasAuthority('USER_ADD')")@PostMapping(path = "/add")public void add(@RequestBody User user){userService.saveUserDetails(user);}

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

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

相关文章

一条命令安装Metasploit Framework

做安全渗透的人都或多或少的使用kali-Linux系统中msfconsole命令启动工具&#xff0c;然而也经常会有人遇到这样那样的问题无法启动 今天我们就用一条命令来重新安装这个工具 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/met…

AI学习AI知识路线

数学基础 一、数据分析 二、概率论 三、线性代数及矩阵 l 数学基础 1)常数e2)导数3)梯度 4)Taylor5)gini系数6)信息熵与组合数 1)概率论基础2)古典模型3)常见概率分布 4)大数定理和中心极限定理5)协方差(矩阵)和相关系数 6)最大似然估计和最大后验估计 1)线性空间及线性变…

Windows内核--内存区对象(Section Object)(5.2)

内存区对象 Section Object表示可以共享的内存段。进程可以使用Section与其他进程共享其部分内存地址空间. Section还可为进程提供将文件映射到其内存地址空间的机制。 Linux有mmap与之类似。 参考: Section Objects and Views 内存区对象是虚拟描述符表VAD节点的一种 VAD树节点…

LabVIEW如何确保自动化设备的稳定性和可靠性?

为了确保LabVIEW在自动化设备中的稳定性和可靠性&#xff0c;可以采取以下关键措施&#xff1a; 1. 代码架构与设计 模块化设计&#xff1a;将程序分解为独立的模块或子VI&#xff0c;每个模块负责特定功能&#xff0c;便于测试和维护。状态机架构&#xff1a;使用状态机架构…

zookeeper选主之LeaderLatch

概述 利用zookeeper来进行选主&#xff0c;可以使用apache curator framework&#xff0c;它给我们封装了两种选主工具&#xff0c;它们分别是LeaderSelector和LeaderLatch。它们各自的应用场景不一样&#xff0c;LeaderSelector应用于那些需要频繁变主的情况&#xff0c;而Le…

Redis机制-Redis互斥锁、分布式锁

目录 一 互斥锁 二 分布式锁 Redis实现分布式锁 redisson实现分布式锁 可重入性&#xff1a; 主从一致性&#xff08;性能差&#xff09;&#xff1a; 一 互斥锁 假设我们现在有一个业务要实现秒杀优惠券的功能&#xff0c;如果是一个正常的流程&#xff0c;线程之间应该…

数据结构中链表的题目

题目&#xff1a; 设计一个算法&#xff0c;要求将链表中所有节点的链接方向“原地”逆转&#xff0c;即要求仅利用原表的存储空间。 对于这个问题&#xff0c;首先要分析的是&#xff1a;链表中的头和尾节点如何插入&#xff1f;其次就是&#xff1a;如何链接&#xff1f; 搞懂…

阅读笔记——《未知协议状态机推断技术研究综述》

【参考文献】盛嘉杰, 牛胜杰, 陈阳, 等. 未知协议状态机推断技术研究综述[J]. 计算机与现代化, 2023 (05): 58.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 摘要 协议逆向工程&#xff08;PRE&#xff09;描述了协议的行为逻辑&#xff…

spring cloud config server源码学习(一)

文章目录 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…

python3 + selenium webdriver自动化测试启动不同浏览器

selenium webdriver自动化测试启动不同浏览器 selenium webdriver 介绍Selenium WebDriver 进行自动化测试的一般流程浏览器驱动下载浏览器驱动的安装chrome、edge、Firefox、Opera、Safari、phantomjs 应用Headless Chrome 、Headless Firefox 应用 selenium webdriver 介绍 …

shell命令运行原理及Linux权限问题

目录 shell命令以及运行原理用户管理添加用户删除用户sudo Linux权限的概念Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法 目录的权限粘滞位 shell命令以及运行…

备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析(持续)

多做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一&#xff0c;通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;可以通过真题查漏补缺&#xff0c;更有针对性的补齐知识的短板。 今天我们继续…

PostgreSQL基本使用Schema

参考文章&#xff1a;PostgreSQL基本使用&#xff08;3&#xff09;Schema_pg数据库查询schema-CSDN博客 PostgreSQL 模式&#xff08;Schema&#xff09;可以理解为是一个表的集合&#xff08;或者所属者&#xff09;。 例如&#xff1a;在 MySQL 中&#xff0c;Scheam 是库&…

gcc源码分析(AST抽象语法树)

文章目录 三、AST相关1、AST(抽象语法树)1.1 树结点的声明1.2 树结点的结构1.2.1 tree_node联合体1.2.2 tree_base结构体1.2.3 tree_common结构体1.2.4 常量结构体1.2.5 **标识符节点**2、符号绑定,作用域与block树节点2.1 lang_identifier结构体2.2 c_binding结构体2.3 scop…

HLS视频加密,让您的视频内容更安全!

背景介绍 HLS视频加密是一种基于HTTP Live Streaming&#xff08;HLS&#xff09;协议的加密技术。它的核心思想是将视频切片进行加密处理&#xff0c;在客户端播放时需要先获取解密密钥才能正常偶发。通过这种方式&#xff0c;HLS加密可以有效防止未经授权的第三方窃取视频内…

测试短信推荐参考

短信测试参考 国外&#xff1a; smstome 支持多个国家号码 官网地址&#xff1a; https://smstome.com/ quackr.io 支持多个国家号码 官网地址&#xff1a; https://quackr.io/ receive-smss 支持多个国家号码 地址&#xff1a; https://receive-smss.com/ receive-sms-fr…

C#字典的常用方法

C#的字典&#xff08;Dictionary&#xff09;类是一个通用的集合类&#xff0c;它实现了键值对的存储和访问。以下是一些常用的字典方法&#xff1a; Add(key, value)&#xff1a;向字典中添加一个指定的键值对。Remove(key)&#xff1a;从字典中移除具有指定键的元素。Contai…

LLM大模型的7种推理框架分析

LLM的7种推理框架 Hugging Face的transformers 这是一个Python库&#xff0c;可以简化本地运行LLM的过程。 Transformers的优点&#xff1a; 自动模型下载提供代码片段非常适合实验和学习 Transformers的缺点&#xff1a; 需要对ML和NLP有深入了解需要编码和配置技能 2.L…

深度学习之基于Tensorflow低光增强的深层Retinex分解

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;低光照环境下的图像增强是一个具有挑战性的问题。为了提高图像的可…

纽曼新品X1000:轻巧便携仅重9.9公斤的1度电应急电源

在户外救援行动和应急设备中&#xff0c;电力供应的稳定性和安全性直接影响到救援工作的效率和成功率。在现代救援工作中&#xff0c;常见的光学声波探测仪、通信联络设备、气象检测仪、生命探测仪、照明设备等装备均需有持续的电力供应&#xff0c;才能保障救援工作的有序开展…