当前位置: 首页 > 知识库问答 >
问题:

如何使用Azure AD B2C保护Spring Boot REST API?

闻人宏盛
2023-03-14

我将Spring Boot 2.2.0与azure-active-directory-b2c-Spring-Boot-starter一起使用。我设法用它(按照他们的教程)获得了一个Thymeleaf网页。现在,我想要一个REST API,它以同样的方式受到保护,因为实际的应用程序将是一个移动应用程序,它对我的Spring Boot后端进行REST调用。

我已经找到了如何使用密码授权流获取令牌的方法:

POST https://<my-tenant-id>.b2clogin.com/<my-tenant-id.onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_<my-custom-policy>

(以用户名和密码为参数)

所以一个移动应用可以使用这个电话。但是我应该如何配置我的Spring Boot应用程序,以便使用Authorization:Bearer

更新:

我试着加上:

<dependency>
  <groupId>org.springframework.security.oauth</groupId>
  <artifactId>spring-security-oauth2</artifactId>
  <version>2.3.7.RELEASE</version>
</dependency>

与:

@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class OAuth2ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("my-azure-b2c-test");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**")
            .authenticated();
    }
}

但当我在我的Spring Boot应用程序上执行请求时,我会得到一个带有“invalid_token”错误的401。


共有1个答案

蒋茂材
2023-03-14

一旦你知道了,解决方法似乎很简单。

首先,添加以下依赖项:

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-resource-server</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-jose</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>

接下来指定Spring。安全oauth2。资源服务器。jwt。jwk在应用程序中设置uri属性。属性文件。

要知道该值,请在https上执行GET(使用cURL或其他工具)://

这将返回一个带有jwks_uri值的JSON正文。将该值放入应用程序中。属性文件。

现在在项目中创建这个Java类:

import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**")
            .authenticated()
            .and()
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
    }
}

如果现在有这样的控制器:

@RestController
public class ApiController {

    @GetMapping("/api/test")
    public String apiTest(@AuthenticationPrincipal Principal principal) {
        return "test " + principal;
    }
}

如果使用正确的Authorization头(类型为org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken)进行GET onapi/test,您将看到主体不是空的

唯一不幸的是校长没有权威,这是我仍然需要弄清楚的原因。

 类似资料:
  • 问题内容: 通常在服务器级别阻止DDoS(分布式拒绝服务攻击),对吗? 有没有办法在PHP级别上阻止它,或者至少减少它? 如果没有,阻止DDoS攻击的最快,最常见的方法是什么? 问题答案: DDOS是一系列攻击,它们淹没了数据中心的关键系统,其中包括: 托管中心与互联网的网络连接 托管中心的内部网络和路由器 您的防火墙和负载平衡器 您的Web服务器,应用程序服务器和数据库。 在开始构建DDOS防御

  • 问题内容: 通常我跑步时总是得到这个输出,我确信每个人在跑步时都会得到。这不是全部输出,而是有关特定语句的。 正如标题所说的,我总是得到输出。如何确保端口ChromeDriver仅使用受保护的端口? 问题答案: 此信息消息… …是 ChromeDriver v2.46* 引发的错误的结果 * 分析 根据讨论,如果启用了详细日志记录,则2.46会生成意外的debug.log文件,在logging.c

  • 问题内容: 我的应用程序使用Express和AngularJS。我正在使用express通过静态处理角度代码的基本网络设置。角度代码使用的服务会影响express托管的API端点。我只希望用户经过身份验证后才能访问API端点。如何通过PassportJS完成此操作? 问题答案: 我已经在github上上传了一个Angular-Express 项目。 仍在进行中。希望对您有所帮助。 它使用Passp

  • 问题内容: 我注意到我的网站上有奇怪的请求,试图找到phpmyadmin,例如 等等 现在,我已经通过apt在Ubuntu上安装了PMA,并希望通过不同于/ phpmyadmin /的网址访问它。我该怎么做才能改变它? 谢谢 更新资料 对于Ubuntu 9.10和Apache2,相应的设置位于该文件的链接中。该文件包含 如果要避免不必要的活动,则应将第一个更改为其他内容,例如: 问题答案: 最大的

  • 问题内容: 我已经使用Socket.IO了几天,这既令人兴奋又令人沮丧。缺少当前的文档/教程使学习变得非常困难。我终于设法创建了一个基本的聊天系统,但是有一个明显的问题。如何保护它? 是什么阻止了恶意用户复制(或编辑)我的代码并连接到我的服务器?我可以从我的PHP脚本中获取用户名并将其提交给Socket.IO,这样我就可以将他们识别为该用户(当然,PHP具有安全性),但是又是什么阻止了某人仅提交未

  • 本文向大家介绍如何使用SpringSecurity保护程序安全,包括了如何使用SpringSecurity保护程序安全的使用技巧和注意事项,需要的朋友参考一下 首先,引入依赖: 引入此依赖之后,你的web程序将拥有以下功能: 所有请求路径都需要认证 不需要特定的角色和权限 没有登录页面,使用HTTP基本身份认证 只有一个用户,名称为user 配置SpringSecurity springsecur

  • 我尝试使用相同的表单登录管理员和用户,但config/auth I只能设置一个默认值 这是我的配置/auth 当我用默认的web_users登录用户时,我可以用方法Auth::user()检索他的数据,但是如果我用默认的web_admins登录管理员,则无法检索任何内容。 路线: 日志控制器 注释:对不起我的英语,我讲得不太好

  • 请帮助使用异步路由保护。 我有服务,它检查身份验证用户: /home/kalinin/angular2/practice/feedbacks/src/app/services/agreement-guard.service.ts(8,14)中的错误:类“AgreeGuardService”错误地实现了接口“canactivate”。属性“可以激活”的类型不兼容。类型'()=>void'不能分配给类