【 SpringSecurity】第三方认证方法级别安全
文章目录
- SpringSecurity 第三方认证
- 实现方法级别的安全
SpringSecurity 第三方认证
在登录网页时,时常有用其他账号登录的方式,它们能够让用户避免在Web站点特定的登录页上自己输入凭证信息。这样的Web站点提供了一种通过其他网站(如Facebook)登录的方式,用户可能已经在这些其他的网站登录过了
这种类型的认证是基于OAuth2或OpenID Connect(OIDC)的。OAuth2是一个授权规范。OpenID Connect是另一个基于OAuth2的安全规范,用于规范化第三方认证过程中发生的交互
要在Spring应用中使用这种类型的认证,我们需要在构建文件中添加OAuth2客户端的starter依赖,如下所示:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
接下来至少要配置一个或多个oauth2或者openID Connect服务器的详细信息,也可以通过一些额外的属性来配置其他客户端
首先有一些通用的属性需要设置,通用格式如下:
spring:security:oauth2:client:registration:<oauth2 or openid provider name>:clientId: <client id>clientSecret: <client secret>scope: <comma-separated list of requested scopes>
比如说使用fb登录:
spring:security:oauth2:client:registration:facebook:clientId: <facebook client id>clientSecret: <facebook client secret>scope: email, public_profile
其中,客户端ID和secret是用来标识我们的应用在Facebook中的凭证。你可以在Facebook的开发者网站新建应用来获取客户端ID和secret。scope属性可以用来指定应用的权限范围
当用户尝试访问需要认证的页面时,就会重定向至认证页面,他们会被要求根据所请求的权限范围对我们的应用程序授权。最后,用户会被重新定向到我们的应用程序,此时他们已经完成了认证
但是,我们如果通过声明SecurityFilterChain bean来自定义安全配置,那么除了其他的安全配置,还需要启用OAuth2登录,如下所示:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {return http.authorizeRequests().mvcMatchers("/design", "/orders").hasRole("USER").anyRequest().permitAll().and().formLogin().loginPage("/login").and().oauth2Login()....and().build();
}
如果同时需要支持传统的通过用户名和密码登录,可以在配置中指定登录页,如下所示:
.and().oauth2Login().loginPage("/login")
应用程序始终都会为用户展示一个它本身提供的登录页,在这里,用户可以像往常一样选择输入用户名和密码进行登录。但是,我们也可以在同一个登录页上提供一个链接,从而允许用户使用Facebook登录。在登录页面的HTML模板中,这样的链接如下所示:
<a th:href = "/oauth2/authorization/facebook">Sign in with Facebook</a>
接下来,如何退出应用,只需在HttpSecurity对象上调用方法:
.and().logout()
该配置会建立一个安全过滤器,拦截对“/logout”的POST请求。所以,为了提供退出功能,我们只需要为应用的视图添加一个退出表单和按钮,如下所示:
<form method = "POST" th:action = "@{/logout}"><input type = "submit" value = "Logout"/>
</form>
用户点击按钮的时候,他们的会话将会被清理,这样他们就退出应用了。默认情况下,用户会被重定向到登录页面,这样他们可以重新登录。但是,如果你想要将他们导航至不同的页面,那么可以调用logoutSuccessUrl()指定退出后的页面,如下所示:
.and().logout().logoutSuccessUrl("/")
实现方法级别的安全
Web请求层面考虑安全问题很容易,但这一层面不一定是进行安全限制的最佳场所。有时候,最好在执行受保护的操作时再去校验一下用户是否通过了验证并被授予了足够的权限。
比如说当多个控制器调用同个方法时,就需要添加更多的匹配器来保护其他控制器的请求,作为替代方案,可以直接在方法上启用安全防护:
@PreAuthorize("hasRole('ADMIN')")
public void deleteAllOrders() {orderRepository.deleteAll();
}
@PreAuthorize注解会接受一个SpEL表达式,如果表达式的计算结果为false,这个方法将不会被调用;如果表达式的计算结果为true,方法就允许调用。在本例中,@PreAuthorize会检查用户是否具有ROLE_ADMIN的权限:如果具有,方法将会被调用,所有的订单会被删除;否则,它会将调用中止
如果@PreAuthorize阻止调用,那么Spring Security将会抛出AccessDeniedException。这是一个非检查型异常,所以我们不需要捕获它,除非想要在异常处理中添加一些自定义的行为。如果我们不捕获它,它将会往上传递,最终被Spring Security的过滤器捕获并进行相应的处理——要么返回HTTP 403页面,要么在用户没有认证的情况返回HTTP 403页面,要么在用户没有认证的情况下重定向到登录页面
要使@PreAuthorize发挥作用,需要启用全局的方法安全功能。为了实现这一点,需要使用@EnableGlobalMethodSecurity注解标注安全配置类,如下所示:
@Configuration
@EnableGlobalMethodSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {...
}
@PostAuthorize注解
它用在方法调用之后,通常来讲用处不是特别大。@PostAuthorize注解的运行机制和@PreAuthorize注解基本相同,只不过它的表达式是在目标方法调用完成并返回之后执行的。这样一来,在决定是否允许方法调用的时候,就能让表达式使用方法的返回值了
假设我们有一个能够根据ID来获取订单的方法。我们如果想限制这个方法,使其只能被管理员或订单所属的用户使用,就可以像这样使用@PostAuthorize注解:
@PostAuthorize("hasRole('ADMIN') || " +"returnObject.user.username == authentication.name")
public TacoOrder getOrder(long id) {...
}
如果判定安全的条件依赖于方法调用的返回值,那么该如何保证方法不被调用呢?我们可以先允许方法调用,并在表达式返回值为false时抛出一个AccessDeniedException,从而解决这个难题。
相关文章:
【 SpringSecurity】第三方认证方法级别安全
文章目录 SpringSecurity 第三方认证实现方法级别的安全 SpringSecurity 第三方认证 在登录网页时,时常有用其他账号登录的方式,它们能够让用户避免在Web站点特定的登录页上自己输入凭证信息。这样的Web站点提供了一种通过其他网站(如Facebo…...
达梦数据库在windows上的安装
前言 简单记录达梦数据库DM7在windows10上的安装过程 1 下载并安装安装包 官网登录后才能下载,建议先注册账户。 下载地址:产品下载-达梦数据 ,CPU选择x86,操作系统选择win64即可。解压安装包后,一路安装下去即可。…...
新手Vite打包工具的使用并解决yarn create vite报错
一、手动创建 1.创建vite-Demo文件夹 2.初始化 yarn init -y 3.安装vite yarn add -D vite 4.打包准备 说明:不需要在src下面创建,在vite-Demo文件夹创建 4.1index.js文件 document.body.insertAdjacentHTML("beforeend","<h1>…...
SpringMVC框架——First Day
目录 三层架构 MVC模型 SpringMVC 快速入门案例 SpringMVC的概述(了解) SpringMVC在三层架构的位置 SpringMVC的优势(了解) 创建SpringMVC的Maven项目 1.在pom.xml中添加所需要的jar包 2.在工程的web.xml中配置核心Spring…...
基于C++雪花算法工具类Snowflake -来自chatGPT
#include <iostream> #include <chrono> #include <stdexcept>class Snowflake { private:// 雪花算法的各个参数static constexpr int64_t workerIdBits 5;static constexpr int64_t datacenterIdBits 5;static constexpr int64_t sequenceBits 12;stati…...
若依打印sql
官方issue 自动生成的代码,sql日志怎么没有打印 在ruoyi-admin中的application.yml配置如下。 # 日志配置,默认 logging:level:com.ruoyi: debugorg.springframework: warn#添加配置com.ying: debug输出sql...
Camunda BPM Run下载(7.20)
官网地址: https://camunda.com/ 中文站点:http://camunda-cn.shaochenfeng.com https://downloads.camunda.cloud/release/camunda-bpm/run/7.20/https://downloads.camunda.cloud/release/camunda-bpm/run/7.20/camunda-bpm-run-7.20.0-alpha3.ziphttps://downloads.camunda…...
【Ubuntu】Ubuntu 22.04 升级 OpenSSH 9.3p2 修复CVE-2023-38408
升级原因 近日Openssh暴露出一个安全漏洞CVE-2023-38408,以下是相关资讯: 一、漏洞详情 OpenSSH是一个用于安全远程登录和文件传输的开源软件套件。它提供了一系列的客户端和服务器程序,包括 ssh、scp、sftp等,用于在网络上进行…...
【知网检索】2023年金融,贸易和商业管理国际学术会议(FTBM2023)
随着经济全球化,贸易自由化的进程加快,我国经济对外开放程度不断加深,正在加快融入世界经济一体化当中。当今世界各国竞争过程中,金融、贸易以及商业形态已成为其关键与焦点竞争内容。 2023年金融、贸易和商业管理国际学术会议(F…...
数据可视化:Matplotlib详解及实战
1 Matplotlib介绍 Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。 Matplotlib提供了一个套面向绘图对象编程的API接口,能够很轻松地实现各种图像的绘制,并且它可以配合Python GUI工具(…...
Flutter flutter_boost 集成
刚开始接触使用flutter boost路由的心得体会记录如下: Fltter项目部分: 第一步 在Flutter项目的 pubspec.yaml文件中添加如下信息: flutter_boost:git:url: https://github.com/alibaba/flutter_boost.gitref: 4.3.0之后在flutter工程下运…...
Stable Diffusion中人物生成相关的negative prompts
下面是常用的negative prompt,在使用stable Diffusion webui等工具生成时可以填入。 bad anatomy, bad proportions, blurry, cloned face, deformed, disfigured, duplicate, extra arms, extra fingers, extra limbs, extra legs, fused fingers, gross proporti…...
QT - 建立页面
一、生成页面 二、实现 1.LineEdit 是一个单行输入文本框,为用户提供了比较多的编辑功能,例如选择复制、粘贴。 修改echomode属性为password Push Button(常规按钮) 三、程序 声明全局变量,属于MainWindow private: // 定义了一个指向Ma…...
python中几个有趣的函数和推导式
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 一、range()函数 1、range()通常用来做循环。 2、range()生成器的特性。 例子:假如range()中使用的数值特别大,为100000000000000000000000000000? python解释…...
【Jenkins】Jenkins 安装
Jenkins 安装 文章目录 Jenkins 安装一、安装JDK二、安装jenkins三、访问 Jenkins 初始化页面 Jenkins官网地址:https://www.jenkins.io/zh/download/ JDK下载地址:https://www.oracle.com/java/technologies/downloads/ 清华源下载RPM包地址ÿ…...
LNMP搭建以及Discuz论坛部署
目录 LNMP 编译安装 LNMP搭建 Nginx 服务 MySQL 服务 PHP 解析环境 部署 Discuz社区论坛 LNMP 目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件,能提供静态页面服务和动态web服务 L linux系统 N nginx网站服务࿰…...
MGRE综合
实验 一、实验思路 1.先按照上图配置IP地址及环回 2.写缺省使公网可通 3.让R1、R4、R5每台路由器均成为中心站点形成全连网状结构拓扑 4.让R1成为中心站点R2R3为分支站点 5.分区域宣告ospf之后更改ospf在虚拟接口Tunnel工作方式为broadcast及让R1 当选DR 二、上虚拟机操作…...
hcip的mgre和ospf实验
题目 拓扑图 一、配置环回和IP地址 R1 < Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 64.1.1.1 24 Aug 4 2023 18:56:07-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol…...
gdb学习笔记
参考:https://blog.csdn.net/Stars_WW/article/details/88994391 gdb常用交互命令 启动gdb后,进入到交互模式,通过以下命令完成对程序的调试;注意高频使用的命令一般都会有缩写,熟练使用这些缩写命令能提高调试的效率;…...
java -jar指定外部配置文件
场景 spingboot项目部署jar时,需要时常修改配置,为了方便,将配置文件放到jar包外 操作步骤 在jar包同级目录下创建config文件夹(位置没有强制要求,为了方便而已) 在jar包同级目录下创建start.bat文件,并编辑内容 echo off :: 命令窗口标题 title yudibei_performance_tes…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
