【 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,从而解决这个难题。文章来源地址https://www.toymoban.com/news/detail-636296.html

到了这里,关于【 SpringSecurity】第三方认证&方法级别安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【业务功能篇94】微服务-springcloud-springboot-认证服务-注册功能-第三方短信验证API

      结合我们前面介绍的商城的架构我们需要单独的搭建一个认证服务。   首先创建一个SpringBoot项目,然后添加对应的依赖   我们需要把认证服务注册到Nacos中,添加对应的依赖,然后完成对应的配置 放开Nacos注册中心 然后启动测试   然后我们整理登录和注册的相关

    2024年02月09日
    浏览(57)
  • 【黑马头条之内容安全第三方接口】

    本笔记内容为黑马头条项目的文本-图片内容审核接口部分 目录 一、概述 二、准备工作 三、文本内容审核接口 四、图片审核接口 五、项目集成 内容安全是识别服务,支持对图片、视频、文本、语音等对象进行多样化场景检测,有效降低内容违规风险。 目前很多平台都支持

    2024年02月15日
    浏览(65)
  • 供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁

      在当今数字化时代,供应链的安全性越来越受到重视。企业的成功不仅仅依赖于产品和服务的质量,还取决于供应链中的安全性。然而,随着供应链越来越复杂,第三方合作伙伴的参与也带来了一系列安全风险。本文将探讨供应链安全和第三方风险管理的关键问题,并通过

    2024年02月12日
    浏览(44)
  • 引入供应链安全来保护第三方代码元素

    应用程序安全测试解决方案 DerScanner 添加了一项新功能,允许用户验证应用程序代码中的第三方元素。 开源软件供应链攻击事件一年内增加两倍,网络威胁呈升级趋势。第三方组件的统计数据令人震惊,约占平均应用程序代码量的 80%,使这些组件成为一个重大的网络安全问

    2024年01月19日
    浏览(41)
  • Spring Boot 最新版3.x 集成 OAuth 2.0实现认证授权服务、第三方应用客户端以及资源服务

    Spring Boot 3 已经发布一段时间,网上关于 Spring Boot 3 的资料不是很多,本着对新技术的热情,学习和研究了大量 Spring Boot 3 新功能和新特性,感兴趣的同学可以参考 Spring 官方资料全面详细的新功能/新改进介绍 Spring 版本升级到6.x JDK版本至少17+ … 新特性有很多,本文主要针对

    2024年02月02日
    浏览(73)
  • 安卓APP引入第三方SDK如何做安全检测?

    最近听说好多App都被下架处理了,隐私合规管理特别严格。隔壁王老板公司旗下的一款App就被通报了,说是嵌入的第三方SDK违规收集用户个人信息。 还记得,在2021年的315晚会,上海、北京有几家公司都被报道,其SDK均在未经用户授权,窃取用户个人信息。涉案App有 50多款,

    2024年02月05日
    浏览(42)
  • python安装第三方包(三种方法)

    python安装第三方包(三种方法) 什么是包? 包含一堆python模块,每个模块又包含需多功能的集合体。 Python中有许多的第三包,没有内置,需要安装它们才可以导入使用。 科学计算器:numpy 数据分析:pandas 大数据计算:pyspark、apache-flink 图形可视化:matplotlib、pyecharts 人工智

    2024年02月16日
    浏览(40)
  • python离线环境下安装第三方模块的方法

    一.背景 1.背景: 在实际开发中,我们自己电脑上方便上网可以随时安装自己需要的包文件,但是有的项目现场不能联网或者现场是“内网”不具备联网条件,所以必须解决在“离线电脑上”安装需要的软件包的问题。 2.环境说明以及实现步骤: a.外网电脑:具备一个外网的

    2024年02月10日
    浏览(101)
  • 031-安全开发-JS应用&WebPack打包器&第三方库JQuery&安装使用&安全检测

    1、三方库-JQuery-使用安全 2、打包器-WebPack-使用安全 演示案例: ➢打包器-WebPack-使用安全 ➢第三方库-JQuery-使用安全 创建WebPack,并创建目录src在目录下创建1.js 2.js 1.js 2.js 在创建index.html 由于js相互依赖的顺序不同,造成无法执行 ; 使用 Webpack 的主要原因: 模块化支持 :

    2024年02月22日
    浏览(53)
  • 微信小程序跳转第三方H5的方法

    使用web-view标签进行跳转 首先建立一个新的页面,这个页面就是为了第三方H5页面准备的。 在index.wxml中,写以下代码 在index.js中,写一下代码 在需要点击跳转第三方页面的地方,js文件中用以下代码实现跳转 以上代码就实现了跳转第三方链接/H5页面 项目中大部分时候,需要

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包