创建一个安全的Spring REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

“如果有用,它将被修改。” 这些智慧之言来自我的QA老师,他们解释说,只要对某人有用,并且只要它有用,所有软件都会发展。 我们都知道这一点。 用户每天都要求我们提供新功能,错误修复和域逻辑更改。 随着任何项目(尤其是整体项目)的发展,它可能开始变得难以维护,并且任何新项目的进入门槛都将越来越高。 在本教程中,我很高兴引导您构建安全的Spring REST API,该API试图使用微服务体系结构解决其中的一些难点。

在微服务架构中,您在逻辑上将您的应用程序划分为多个应用程序,这些应用程序可以更轻松地维护和扩展,使用不同的堆栈,并支持更多并行工作的团队。 但是微服务是解决每个扩展和维护问题的简单解决方案。

微服务还提出了许多必须解决的架构挑战:

  • 这些服务如何通信?
  • 通信故障和可用性应如何处理?
  • 如何在服务之间跟踪用户的请求?
  • 而且,您应该如何处理用户授权才能访问单个服务?

让我们深入研究并了解在构建Spring REST API时如何应对这些挑战。

使用OAuth 2.0保护Spring REST API

在OAuth 2.0中 ,资源服务器是一种旨在处理域逻辑请求的服务,并且没有任何类型的登录工作流程或复杂的身份验证机制:资源服务器接收预先获得的访问令牌,该令牌可确保用户具有访问服务器的授权权限并提供预期的响应。

在本文中,您将使用Spring Boot和Okta构建一个简单的Resource Server ,以演示它的简单性。 您将实现一个简单的资源服务器 ,该服务器将接收并验证JWT令牌

将资源服务器添加到Spring REST API

本示例使用Okta处理所有身份验证过程。 您可以注册一个永久免费的开发者帐户 ,该帐户使您可以创建所需的任意数量的用户和应用程序。

我已经设置了一些东西,所以我们可以轻松上手。 请克隆以下资源存储库并转到startup标记,如下所示:

git clone -b startup https://github.com/oktadeveloper/okta-secure-spring-rest-api-example secure-spring-rest-api
cd secure-spring-rest-api

该项目具有以下结构:

$ tree .
.
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src├── main│   ├── java│   │   └── net│   │       └── dovale│   │           └── okta│   │               └── secure_rest_api│   │                   ├── HelloWorldController.java│   │                   ├── SecureRestApiApplication.java│   │                   └── SecurityConfig.java│   └── resources│       └── application.properties└── test└── java└── net└── dovale└── okta└── secure_rest_api└── SecureRestApiApplicationTests.java14 directories, 9 files

我使用出色的Spring Initializr并添加了WebSecurity依赖关系来创建它。 Spring Initializr提供了一种简单的方法来创建具有一些常见的自动发现的依赖关系的新Spring Boot服务。 它还会添加Maven包装器 :因此,您使用命令mvnw而不是mvn ,该工具将检测您是否具有指定的Maven版本,如果没有,则将下载并运行指定的命令。

有趣的事实 :您知道Maven包装器最初是由Okta自己的Brian Demers创建的吗?

文件HelloWorldController是一个简单的@RestController ,它输出“ Hello World”。

在终端中,您可以运行以下命令并查看Spring Boot启动:

mvnw spring-boot:run

提示:如果该命令不适合您,请尝试使用./mvnw spring-boot:run代替。

加载完成后,您将准备好REST API并设置为向您传递光彩的Hello World消息!

> curl http://localhost:8080/
Hello World

提示:默认情况下, curl命令对于Windows用户不可用。 您可以从这里下载。

现在,您需要正确创建受保护的资源服务器

设置OAuth 2.0资源服务器

在Okta仪表板中,创建Service类型的应用程序,它指示资源服务器没有登录页面或任何获取新令牌的方式。

单击下一步 ,输入服务名称,然后单击完成 。 您将看到与以下类似的屏幕。 复制并粘贴您的客户端ID客户端密钥以供以后使用。 当您配置应用程序时,它们将非常有用。

现在,让我们编写一些代码!

编辑pom.xml文件,并添加Spring Security和Okta的依赖项。 它们将启用您需要的所有Spring AND Okta OAuth 2.0功能:

<!-- security - begin -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency><groupId>com.okta.spring</groupId><artifactId>okta-spring-boot-starter</artifactId><version>0.6.1</version>
</dependency>
<!-- security - end -->

通过简单地添加此依赖关系,您的代码将变得像没有钥匙的锁屋。 在您向用户提供密钥之前,没有人可以访问您的API。 再次运行以下命令。

mvnw spring-boot:run

现在,尝试访问Hello World资源:

> curl http://localhost:8080/
{"timestamp":"2018-11-30T01:35:30.038+0000","status":401,"error":"Unauthorized","message":"Unauthorized","path":"/"}

将Spring Security添加到您的REST API

Spring Boot具有很多类路径魔术,并且能够发现自动配置依赖项。 既然您已经添加了Spring Security,它会自动保护您的资源。 现在,您需要配置Spring Security,以便可以正确地验证请求。

注意:如果您遇到困难,可以在Git分支step-1-security-dependencies检查修改。

为此,您需要按以下方式修改application.properties (使用Okta仪表板提供给应用程序的client_idclient_secret ):

okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default
okta.oauth2.clientId={clientId}
okta.oauth2.clientSecret={clientSecret}
okta.oauth2.scopes=openid

Spring Boot使用批注和代码来配置您的应用程序,因此您无需编辑超级无聊的XML文件。 这意味着您可以使用Java编译器来验证您的配置!

我通常在不同的类中创建配置,每个类都有其自己的用途。 创建类net.dovale.okta.secure_rest_api.SecurityConfig ,如下所示:

package net.dovale.okta.secure_rest_api;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;@EnableWebSecurity
@EnableResourceServer
public class SecurityConfig  {}

请允许我解释这里的注释的作用:

  • @EnableWebSecurity告诉Spring我们将使用Spring Security提供Web安全机制
  • @EnableResourceServer –方便的批注,可通过OAuth 2.0令牌启用请求身份验证。 通常,您将提供一个ResourceServerConfigurer bean,但是Okta的Spring Boot启动器很方便地为您提供了一个。

而已! 现在,您拥有了一个完全配置且受保护的Spring REST API,无需任何样板!

再次运行Spring Boot并使用cURL进行检查。

mvnw spring-boot:run
# in another shell
curl http://localhost:8080/
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

消息改变了,但是您仍然无法访问...为什么? 因为现在服务器正在等待带有有效令牌的authorization 标头 。 在下一步中,您将创建一个访问令牌并使用它来访问您的API。

注意:如果有任何疑问,请检查Git分支step-2-security-configuration

在您的Spring REST API中生成令牌

那么……您如何获得令牌? 资源服务器不负责获取有效的凭证:它只会检查令牌是否有效,并继续执行方法。

一种使用OpenID Connect <debugger />实现令牌以生成令牌的简单方法。

首先,您需要在Okta中创建一个新的Web应用程序:

登录重定向URI字段设置为https://oidcdebugger.com/debug并将Grant Type允许Hybrid 。 单击“完成”,然后复制客户端ID,以进行下一步。

现在,在OpenID Connect网站上,如下图所示填写表单(不要忘记为您最近创建的Okta Web应用程序填写客户端ID):

提交表单以启动身份验证过程。 如果您尚未登录,则将收到Okta登录表单,否则您将在下面看到带有自定义令牌的屏幕。

令牌的有效期为一小时,因此您可以使用API​​进行大量测试。 使用令牌很简单,只需将其复制并修改curl命令即可使用它,如下所示:

> export TOKEN=${YOUR_TOKEN}
> curl http://localhost:8080 -H "Authorization: Bearer $TOKEN"
Hello World

添加OAuth 2.0范围

OAuth 2.0范围是一项功能,可让用户决定是否将授权该应用程序进行限制。 例如,您可能具有“读取”和“写入”范围。 如果应用程序需要写入范围,则应询问用户该特定范围。 这些可以由Okta的授权服务器自动处理。

作为资源服务器,它可以具有不同的端点,每个端点具有不同的范围。 接下来,您将学习如何设置不同的范围以及如何对其进行测试。

向您的SecurityConfig类添加新的注释:

@EnableWebSecurity
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {}

@EnableGlobalMethodSecurity(prePostEnabled = true)注解告诉Spring使用AOP样方法的安全性和prePostEnabled = true使的注释。 这些注释将使我们能够以编程方式为每个端点定义安全性。

现在,对HelloWorldController.java进行更改以创建一个受范围保护的端点:

import org.springframework.security.access.prepost.PreAuthorize;
import java.security.Principal;
...
@PreAuthorize("#oauth2.hasScope('profile')")
@GetMapping("/protected/")
public String helloWorldProtected(Principal principal) {return "Hello VIP " + principal.getName();
}

注意@PreAuthorize("#oauth2.hasScope('profile')") 。 它说:在运行此方法之前,请验证请求是否具有指定范围的授权。 #oauth2位是由OAuth2SecurityExpressionMethods Spring类添加的(请检查其他可用方法),并通过spring-cloud-starter-oauth2依赖关系添加到您的类路径中。

好! 重新启动后,您的服务器将准备就绪! 使用您当前的令牌向端点发出新请求:

> curl http://localhost:8080/protected/ -H "Authorization: Bearer $TOKEN"
{"error":"access_denied","error_description":"Access is denied"}

由于您的令牌没有所需的范围,因此您会收到一条access is denied消息。 要解决此问题,请回到OIDC调试器并添加新的作用域。

使用新获得的令牌重试:

> curl http://localhost:8080/protected/ -H "Authorization: Bearer $TOKEN"
Hello VIP raphael@dovale.net

而已! 如果您有任何疑问,请检查最新的存储库分支finished_sample

提示:由于profile是OAuth 2.0的常见范围,因此您无需在授权服务器中进行任何更改。 需要创建自定义范围吗? 请参阅此Java应用程序的简单令牌认证 。

了解有关Spring和REST API的更多信息

在本教程中,您学习了如何使用Spring(Boot)创建资源服务器并将其与OAuth 2.0无缝集成。 Spring和REST API都是巨大的话题,有很多讨论和学习的内容。

本教程的源代码可在GitHub上找到 。

以下是一些其他文章,可帮助您进一步了解Spring和REST API安全性:

  • OAuth到底是什么?
  • 使用Spring Boot和OAuth 2.0进行安全的服务器到服务器通信
  • Spring Boot 2.1:出色的OIDC,OAuth 2.0和反应式API支持
  • 在15分钟内将用户身份验证添加到您的Spring Boot应用程序

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。

创建安全REST API''最初于2018年12月18日发布在Okta开发人员博客上。

翻译自: https://www.javacodegeeks.com/2019/01/create-secure-spring-rest-api.html

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

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

相关文章

【渝粤题库】陕西师范大学292071社会统计学作业(高起专)

《社会统计学》作业 一、单项选择题 1、从历史上看&#xff0c;在社会经济统计学的形成过程中&#xff0c;首先使用“统计学”这一术语的是&#xff08; &#xff09;。 A. 政治算术学派 B. 国势学派 C. 数理统计学派 D. 社会经济统计学派 2、社会统计的研究对象是&#xff08;…

java并发编程十 原子累加器和Unsafe

文章目录 原子累加器cas 锁原理之伪共享 UnsafeUnsafe CAS 操作 原子累加器 累加器性能比较 private static <T> void demo(Supplier<T> adderSupplier, Consumer<T> action) {T adder adderSupplier.get();long start System.nanoTime();List<Thread…

mysql select 返回列_SQL / mysql – selectdistinct / UNIQUE,但返回所有列?

你正在寻找一个组&#xff1a;select * from table group by field1偶尔可以写一个独特的声明&#xff1a;select distinct on field1 * from table然而&#xff0c;在大多数平台上&#xff0c;上述两者都不会起作用&#xff0c;因为其他列上的行为是未指定的。 (MySQL中的第一…

【渝粤题库】陕西师范大学300018 世界史(下)

《世界史&#xff08;下&#xff09;》作业 一、名词解释 1、三权分立 2、考迪罗 3、斯大林格勒会战 4、马歇尔计划 5、匈牙利事件 6、美第奇家族 7、明治维新 8、人文主义 9、古巴导弹危机 10、奴隶贸易 11、七年战争 12、大西洋宪章 13、重商主义 14、文官制度 15、《解放宣言…

【渝粤题库】陕西师范大学600002 物理化学(下) 作业(专升本)

《物理化学&#xff08;下&#xff09;》作业 一.选择题 1.已知298 K时&#xff0c;(NH4)2SO4.NaOH.Na2SO4的 分别为3.064 10-2. 2.451 10-2.2.598 10-2 Sm2 mol-1&#xff0c;则NH4OH的为 ( ) A. 1.474 10-2 B. 2.684 10-2 C. 2.949 10-2 D. 5.428 10-2 2.质量摩尔浓度…

java中的规范是什么意思_Java中的异常规范有什么好处?

我从C来到Java.在Java和C中,我们都可以指定异常.看起来像这样&#xff1a;void function_name() throw(Exception){...if (error){throw Exception("Error");}...}据我所知,在C中编写异常规范被认为是一种不好的做法.与C不同,在Java中,我们必须这样做.所以,我的问题是…

jpa中::::_项目学生:JPA标准查询

jpa中::::这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client&#xff0c;带有Jersey的 Webservice Server &#xff0c; 业务层 &#xff0c; 具有Spring Data的持久性 &#xff0c;分片集成测试数据和Webservice Integration 。 我们已经介绍了CRUD的…

【渝粤题库】陕西师范大学800011 专题地图制图

《专题地图制图》作业 一、名词解释 1、专题地图 2、范围法 3、绝对比率符号 4、电子地图 5、普通地图 6、质底法 7、分级统计图法 8、条件比率符号 9、视觉重力 10、定位图表法 11、连续比率符号 12、互补色 二、填空 1、专题地图按照内容的概括程度可以分为 、 、 。 2、专题…

国家开放大学2021春1098中学数学教学研究题目

教育 教育 试卷代号&#xff1a;1098 2021年春季学期期末统一考试 中学数学教学研究 试题 2021年7月 一、填空题&#xff08;本题共20分&#xff0c;每个空2分&#xff09; 1&#xff0e;布卢姆把认知领域的目标分为 、 、 、________4个等级目标。 2&#xff0e;中学数学教学…

java 注解scheduler_使用spring的@Scheduled注解执行定时任务,启动项目不输出警告

在applicationContext.xml中添加&#xff1a;xmlns:task"http://www.springframework.org/schema/task"xsi:schemaLocation"http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.0.xsd">java代码&…

具有ELK的APIGEE API网关日志管理(Elastic Search,Logstash和Kibana)

在本文中&#xff0c;我们将看到如何使用 Elastic Search &#xff0c; Logstash 和 Kibana 管理APIGEE API网关生成的日志 。 下图突出显示了日志数据如何流经ELK堆栈以进行数据可视化和监视。 作为API网关的一部分&#xff0c;我们将使用MessageLogging策略在代理流&#xf…

【渝粤题库】陕西师范大学209010 现代教育战略 作业 (专升本)

《现代教育战略》作业 一、辨析题 1.战术是战略的具体表现形式&#xff0c;二者是一般和特殊的关系。 2.政治品德素质是一个人对国家、民族的政治意识、立场&#xff0c;是一个人的道德好感&#xff0c;是不可教的。 3.创新的新就一般意义的新事物。 4.能力就是一个所拥有的知识…

【渝粤教育】电大中专混凝土结构题库作业 题库

1.题结构试验时&#xff0c;试件的就位型式最符合实际受力状态而应优先采用的是() A.反位试验 B.正位试验 C.卧位试验 D.异位试验 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2.非破损检测技术可应用于混凝土、钢材和砖石砌体等各种材料组成的结构构件的结构试验…

java中PL层_安装pljava - RuralHunter的个人空间 - OSCHINA - 中文开源技术交流社区

pljava是pgsql跟java的桥接&#xff0c;安装以后就可以在pgsql里面调用java了。这里记录一下我在ubuntu server下安装的过程1. 下载源码编译很简单&#xff0c;下载&#xff0c;解压&#xff0c;设置一下JAVA_HOME(如果没设的话)&#xff0c;然后make2. 把生成的build目录里面的…

【渝粤题库】广东开放大学 民事诉讼法学 形成性考核

选择题 题目&#xff1a;在仲裁裁决具有可撤销的法定理由时&#xff0c;仲裁当事人可以向法院申请撤销该仲裁裁决&#xff0c;法院认为当事人的申请具有法定撤销理由的&#xff0c;可以&#xff08; &#xff09;仲裁裁决。 答案&#xff1a; A、调解 B、裁定撤销 C、判决撤销…

java依赖注入_Java依赖注入选项

java依赖注入我想花一些时间来总结一些流行的Java依赖注入&#xff08;DI&#xff09;框架。 这是可用功能的高级概述。 首先&#xff0c;什么是依赖注入&#xff1f; “依赖注入是一种软件设计模式&#xff0c;可以删除硬编码的依赖&#xff0c;并可以在运行时或编译时更改它…

【渝粤教育】电大中专跨境电子商务理论与实务 (19)作业 题库

1.亚马逊的运营模式是M2C模式:平台招商。该说法&#xff08; &#xff09; A.错误 B.正确 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.B2C跨境电商或平台的代表企业有敦煌网&#xff0e;阿里巴巴国际站。该说法&#xff08; &#xff09; A.错误 B.正确 …

Java连接微软ad_Java:连接到Active Directory(AD)?

我正在尝试与AD联系。我试图用这个代码来连接&#xff0c;但它似乎并没有连接。我很抱歉不能比这更具体&#xff0c;但这只是我所知道的。什么都没发生。我已经删除了我认为是这个类的非必要部分&#xff0c;在那里处理结果&#xff0c;因为在这一点上根本没有任何结果需要处理…

java se 定时任务_Java实现定时任务的三种方法

一、Quartz的特点 按作业类的继承方式来分&#xff0c;主要有以下两种&#xff1a; 作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 注&#xff1a;个人比较推崇第二种&…

Spring框架介绍

这是Spring框架和Spring核心概念的简介。 在本教程中&#xff0c;我们将介绍Spring Framework的主要优点和功能。 在随后的教程中&#xff0c;我们将学习有关Spring和Spring Boot的更多信息。 总览 我们知道&#xff0c; Spring框架是Java开发人员中最受欢迎的应用程序框架。 …