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

2023-12-02

我正在使用 Spring Boot 2.2.0azure-active-directory-b2c-spring-boot-starter2.2.0。我设法用它来保护 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 <access-token>API 调用有效吗?我需要哪些依赖项/启动器以及应该如何配置?

UPDATE:

我尝试添加:

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

With:

@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。


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

首先,添加以下依赖项:

        <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.security.oauth2.resourceserver.jwt.jwk-set-uri您的财产application.properties file.

要知道这个值,请执行GET(使用 cURL 或其他工具)https://<my-tenant-id>.b2clogin.com/<my-tenant-id>.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_<my-custom-policy>

这将返回一个 JSON 正文jwks_uri价值。获取该值并将其放入您的application.properties file.

现在在项目中创建这个 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;
    }
}

如果您执行 GET 操作,您将看到主体不为空api/test与一个正确的Authorization标头(它的类型是org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken)

唯一遗憾的是校长没有权力,我还需要弄清楚为什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Azure AD B2C 保护 Spring Boot REST API 的安全? 的相关文章

随机推荐

  • 如何在 SQL Server 中使用带框架的窗口函数执行 COUNT(DISTINCT)

    搭载这个可爱的问题 可以使用 DISTINCT 进行分区函数 COUNT OVER 我希望计算不同值的移动计数 大致如下 Count distinct machine id over partition by model order by
  • C++11 之前的初始值设定项列表中同一变量的多个突变是否为未定义行为

    考虑以下代码 int main int count 0 int arrInt 2 count count return 0 如果我们使用以下命令编译代码clang std c 03它会产生以下警告 活生生的例子 warning multip
  • redbean - 嵌套豆 - 出了什么问题?

    我正在尝试建立一个简单的嵌套 bean 关系 我错过了什么 我真的很喜欢 redbean 简单的 ORM 语法 并且真的很想使用它 但我似乎无法让它为我工作 还有其他类似的东西可能更成熟吗 我想要一些轻量且简单的东西来构建 WordPres
  • setCloseButtonIcon(Bitmap drawable) 不适用于 ChromeCustomTab 中的 SVG

    我需要更改 ChromeCustomTab Android 中的默认十字图标 我使用以下代码通过后退图标更改它 Bitmap icon BitmapFactory decodeResource context getResources R
  • 无法使用 spring 连接到 Azure SQL 数据库服务器

    我能够连接到具有 IP 地址的数据库 但是如果 我在 Azure SQL 数据库服务器中创建了我的数据库 因为我无法使用 spring 配置 Java Web 应用程序进行连接 它显示错误说 与主机 vinayaka cloudapp ne
  • Shell 脚本中的字符串连接错误

    我是 Shell 脚本编写的初学者 我使用了一个变量来存储值A MyScript 我尝试在后续步骤中连接字符串 A new 令我惊讶的是它不起作用并且 A new worked 您能帮我理解这些细节吗 Thanks Shell 变量名由字母
  • 显示来自 BroadcastReceiver 的复杂 Toast

    我想知道是否有人可以帮助我 我试图在收到短信时显示 toast 元素 这个 toast 应该包含一个布局 其中有一个图像 短信图标 和 2 个文本视图 发件人 消息 如果我从活动中调用以下方法 它将按预期工作 public void sho
  • 为什么 item.getMenuInfo() 为空?

    在我的 ListView 项目中 我有 4 8 个 ImageView 其中一些是不可见的 具体取决于某些值 和 4 个 TextView 当我长按 Listview 的项目时 AdapterContextMenuInfo item get
  • 如何判断 DOM 元素在当前视口中是否可见?

    有没有一种有效的方法来判断 DOM 元素 在 HTML 文档中 当前是否可见 出现在viewport 问题涉及 Firefox Now 大多数浏览器支持获取边界客户端矩形方法 这已成为最佳实践 使用旧答案非常慢 不准确 and 有几个错误
  • 不支持的操作:不可写 python

    电子邮件验证 Email validator import re def is email email input Enter your email pattern w 1 w w file open ValidEmails txt r i
  • 如何为 Eclipse 编写插件? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我如何开始编写插件Eclipse 我找过文档 但不幸的是很少或者很差 那么有哪些文章可以推荐呢 Eclipse 和 IBM 的主站点上有一些非常好的资源和教程 最好的方法之一是选
  • mysql_insert_id线程安全吗?

    我正在使用 MySQL C API 构建数据库客户端应用程序 并且我需要获取 INSERT 语句中的最后一个自动增量值 因此 mysql insert id 可以做到 但是这个客户端是多线程的 并且是这样的一段代码 mysql query
  • 如何在Python中使列表只包含不同的元素? [复制]

    这个问题在这里已经有答案了 我有一个 Python 列表 如何使其值唯一 最简单的方法是转换为集合 然后再转换回列表 my list list set my list 这样做的一个缺点是它不会保留订单 您可能还想首先考虑使用集合 而不是列表
  • 保护正在访问的用户文件,以便只有所有者才能访问?

    我正在用 php 编写一个 Web 应用程序 用户可以在其中上传自己的文件或图像 但如何保护这些文件不被所有者以外的其他人访问 想想 dropbox 保护这些文件的机制是什么 我尝试过搜索 但没有得到任何关于此的信息 任何指向教程的指针或链
  • 使用进程名称获取另一个程序的窗口标题

    这个问题可能很基本 但我很难破解它 我假设我必须使用一些东西ctypes windll user32 请记住 我几乎没有使用这些库的经验 甚至没有ctypes作为一个整体 我已经使用此代码列出了所有窗口标题 但我不知道应该如何更改此代码以获
  • 使用html5(提醒应用程序)访问电话闹钟(原生资源)

    这些是我的技术 HTML5 Jquery 移动 Jquery Javascript Css Cordova 我们正在使用 HTML 5 开发应用程序 我们需要访问手机 Android iPhone Windows Phone 资源 例如闹钟
  • Swift 中的重命名问题

    我是第一次使用 Swift 进行编程 在此过程中我遵循this教程 不幸的是 该教程看起来有点过时 并且大多数代码都会引发构建时错误 最常出现的错误是NSURLSession has been renamed to URLSession 我
  • 如何使用 python 以“更智能”的方式下载文件?

    我需要在Python中通过http下载几个文件 最明显的方法就是使用 urllib2 import urllib2 u urllib2 urlopen http server com file html localFile open fil
  • 使用 SICStus Prolog 推广斐波那契数列

    我正在尝试寻找广义斐波那契序列 GFS 查询的解决方案 问题是 是否有第 12 个数字为 885 的 GFS 最初的 2 个数字可能限制在 1 到 10 之间 我已经找到了在从 1 1 开始的序列中查找第 N 个数字的解决方案 其中我明确定
  • 如何使用 Azure AD B2C 保护 Spring Boot REST API 的安全?

    我正在使用 Spring Boot 2 2 0azure active directory b2c spring boot starter2 2 0 我设法用它来保护 Thymeleaf 网页 按照他们的教程 现在 我想要一个以相同方式保护