【 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,从而解决这个难题。

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

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

相关文章

matlab使用教程(9)—matlab基本语句

1.条件控制 - if、else、switch 条件语句可用于在运行时选择要执行的代码块。最简单的条件语句为 if 语句。例如&#xff1a; % Generate a random number a randi(100, 1); % If it is even, divide by 2 if rem(a, 2) 0 disp(a is even) b a/2; end 通过使用可选关键字 …

fishing之第四篇使用案例一模拟登陆口

文章目录 一、访问钓鱼平台二、Sending Profiles(发件人邮箱配置)三、User&Groups(接收人邮件列表)四、Landing Pags(钓鱼页面配置)五、Email Templates(邮件内容配置)六、Campaigns七、攻击结果查看免责声明一、访问钓鱼平台 详细查看第二篇的gophish的搭建 二…

WebRTC 之音视频同步

在网络视频会议中&#xff0c; 我们常会遇到音视频不同步的问题&#xff0c; 我们有一个专有名词 lip-sync 唇同步来描述这类问题&#xff0c;当我们看到人的嘴唇动作与听到的声音对不上的时候&#xff0c;不同步的问题就出现了 而在线会议中&#xff0c; 听见清晰的声音是优先…

Java窗体应用程序人事管理系统web人资招聘员工劳资jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 Java窗体应用程序人事管理系统 注意&#xff1a;此项…

Python 开发工具 Pycharm —— 使用技巧Lv.1

Basic code completion Ctrl空格 is available in the search field when you search for text in the current file CtrlF, so there is no need to type the entire string 基本代码完成Ctrl 空格可在搜索领域当你搜索文本在当前文件Ctrl F,所以没有必要整个字符串类型 To m…

迅为全国产龙芯3A5000电脑运行统信UOS、银河麒麟、loongnix系统

iTOP-3A5000开发板采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch) 的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。在与龙芯3A4000处理器保持引脚兼容的基础上&#xff0c;频率提升至2.5GHZ&#xff0c;功耗降…

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 &#xff08;1&#xff09;预下载 &#xff08;2&#xff09;测试 &#xff08;3&#xff09;命令行 &#xff08;4&#xff09;测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供&#xff0c;其安装…

STL容器适配器 -- priority_queue(使用+实现)(C++)

priority_queue priority_queue 简单介绍priority_queue 使用内置类型测试自定义类型测试 priority_queue 模拟实现仿函数&#xff08;less、greater&#xff09; priority_queue 简单介绍 优先级队列是一种容器适配器。类似于堆&#xff0c;可以随时插入元素&#xff0c;只能…

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具&#xff0c;它能够创建高性能、一致性的备份&#xff0c;并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下&#xff0c;复制InnoDB存储引擎的数据文件和事务日…

应用Numpy实现对数据的处理

创建简单的数组 主要使用np.array()函数&#xff0c;语法如下 import numpy as np np.array(object,dtypeNone,copyTrue,orderK,subokFalse,ndmin0) 主要参数&#xff1a; Object&#xff1a;任何具有数组接口方法的对象 dtype&#xff1a;数据类型 ndmin:指定生成数组的最…

Apache Thrift C++库的TThreadPoolServer模式的完整示例

1. 本程序功能 1) 要有完整的request 和 response; 2) 支持多进程并行处理任务&#xff1b; 3)子进程任务结束后无僵尸进程 2.Apache Thrift C库的编译和安装 见 步步详解&#xff1a;Apache Thrift C库从编译到工作模式DEMO_北雨南萍的博客-CSDN博客 3.框架生成 数据字…

简述静态网页和动态网页的区别。简述 Webl.0 和 Web2.0 的区别。安装tomcat8,配置服务启动脚本,部署jpress应用

静态网页和动态网页区别 静态网页和动态网页是两种常见的网页类型&#xff0c;它们在内容生成和交互方式上存在不同。 静态网页是在服务器上提前生成好的网页&#xff0c;它的内容在访问时不会发生变化。静态网页通常由HTML、CSS和JavaScript等静态文件组成&#xff0c;这些文…

【css问题】flex布局中,子标签宽度超出父标签宽度,导致布局出现问题

场景&#xff1a;文章标题过长时&#xff0c;只显示一行&#xff0c;且多余的部分用省略号显示。 最终效果图&#xff1a; 实现时&#xff0c;flex布局&#xff0c;出现问题&#xff1a; 发现text-overflow: ellipsis不生效&#xff0c;省略符根本没有出现。 而且因为设置了 …

《MySQL高级篇》十五、其他数据库日志

文章目录 1. MySQL支持的日志1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志3.1 问题场景3.2 查看当前状态3.3 启动日志3.4 查看日志3.5 停止日志3.6 删除\刷新日志 4. 错误日志(error log)4.1 启动日志4.2 查看日志4.3 删除\刷新日志4.4 MySQL8.0新…

ThreadLocal有内存泄漏问题吗

对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客 我这里也简单总结一下: 1. 每个Thread里都存储着一个成员变量&#xff0c;ThreadLocalMap 2. ThreadLocal本身不存储数据&…

flutter开发实战-实现首页分类目录入口切换功能

。 在开发中经常遇到首页的分类入口&#xff0c;如美团的美食团购、打车等入口&#xff0c;左右切换还可以分页更多展示。 一、使用flutter_swiper_null_safety 在pubspec.yaml引入 # 轮播图flutter_swiper_null_safety: ^1.0.2二、实现swiper分页代码 由于我这里按照一页8…

装饰器模式(C++)

定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。 一《设计模式》 GoF 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xf…

[openCV]基于拟合中线的智能车巡线方案V2

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表"""newDir d…

【JavaScript】元素获取指南

简介 在 JavaScript 中,我们经常需要通过获取元素来进行 DOM 操作和交互。本教程将介绍多种获取元素的方式,包括根据 ID、标签名、类名、选择器、属性和名称等。 通过ID获取元素 使用getElementById方法根据元素的ID属性获取单个元素。 var element = document.getElementB…

机器学习框架PyTorch详解和案列分析

目录 一、基本介绍二、基本概念三、操作流程四、详细安装命令五、应用场景六、最新发展 PyTorch 是一个基于 Python 的科学计算包&#xff0c;主要针对两类人群&#xff1a; 作为 NumPy 的替代品&#xff0c;可以利用 GPU 的性能进行计算。作为一个高灵活性、速度快的深度学习平…