OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。

现代应用程序依赖于用户身份验证,但是它可能给Java开发人员带来困难的挑战,以及一系列特定于框架的选项供您选择。 我们已经看到许多Spring开发人员从一个简单的本地身份验证服务开始,他们计划用一个更强大的选项替换“后来的”……只是为了让该本地服务将其方式扩展到堆栈中的永久位置。 为了结束这一令人心碎的周期,这篇文章将展示即使在一个简单的应用程序中实现企业级身份验证服务也是如此简单。

在本教程中,您将创建一个显示用户信息的应用程序。 您将首先手动配置它,以查看其缺点。 然后,我们将使用更专业的方法。 在本教程结束时,您将拥有一个基于Spring的Java应用程序,该应用程序使用OAuth 2.0对用户进行身份验证,并且需要5分钟的时间进行这些更改!

使用Spring创建Java应用程序

让我们从创建项目结构开始。 您将使用Spring Initializer创建应用程序。 转到start.spring.io并填写以下信息:

  • 项目: Maven项目
  • 语言: Java
  • 组: com.okta.authorizationapp
  • 工件: oauth
  • 依存关系:
    • Spring网

您也可以从命令行生成项目。 将以下命令粘贴到终端中,以使用与上述相同的配置下载项目:

curl https://start.spring.io/starter.zip \-d dependencies=web,thymeleaf,security \-d packageName=com.okta.authorizationapp \-d name=authorization-app \-d type=maven-project \-o java-authorization-app.zip

而已! 现在,您的Java项目结构已创建,您可以开始开发应用程序了。

自行构建用户安全性

本教程将使用Maven,但您可以根据需要轻松使用Gradle进行操作。

首先,将项目导入您喜欢的IDE /编辑器中。 现在,您的项目只有一个类,即引导应用程序的style="font-size:13px" class="highlighter-rouge">AuthorizationAppApplication 。 运行此类时,服务器将启动,并且您可以转到浏览器以查看结果。

但是,您首先需要一个页面才能访问,因此让我们创建一个主页。

内部style="font-size:13px" class="highlighter-rouge">src/main/java/com/okta/authorizationapp/controller/创建类style="font-size:13px" class="highlighter-rouge">HomeController

@Controller
public class HomeController {private Map<String, LocalDateTime> usersLastAccess = new HashMap<>();@GetMapping("/")public String getCurrentUser(@AuthenticationPrincipal User user, Model model) {String username = user.getUsername();model.addAttribute("username", username);model.addAttribute("lastAccess", usersLastAccess.get(username));usersLastAccess.put(username, LocalDateTime.now());return "home";}
}

此类定义了/路径的控制器。 当您在未定义任何其他路径的情况下访问应用程序时,将执行此代码。

控制器的第一个重要操作将检索当前用户的信息。 由于您使用AuthenticationPrincipal注释了user属性,因此Spring Security将自动检索此信息。

控制器还接收一个model参数,该参数存储用于呈现页面的数据。 现在,此数据是username和用户上次访问您的应用程序的时间。

在用户登录时创建动态消息

最后一步是更新用户的上次访问日期,并定义应呈现请求HTML模板。 在您的情况下,端点称为home 。 Spring将在src/main/resources/templates文件夹中搜索home.html文件。

您还没有此文件,所以让我们去创建它:

<html><head><title>Java OAuth 2.0 Tutorial - Homepage</title></head><body><h1 th:text="'Welcome, ' + ${username} + '!'"></h1><ul><li th:if="${lastAccess}" th:text="'Last access: ' + ${lastAccess}"></li></ul></body>
</html>

这是一个HTML文件,由Thymeleaf稍作更改, Thymeleaf是您在创建项目时导入的库之一。 Thymeleaf从服务器接收模型对象,并以HTML呈现该对象的值。 只需键入${variable}即可引用model对象中的变量。

通过th:text属性,您可以在HTML元素中定义动态文本。 在这里,我们使用它来显示动态问候语,以及用户最后一次访问该应用程序的时间。

用户首次访问您的应用时,不会记录之前的访问权限。 为了确保您不会出现无意义的字段,请使用th:if 。 如果该字段为null ,则不会呈现li标签,并且用户将看不到它。

将基本登录添加到Java Spring应用程序

现在有了端点,您只需要为应用程序添加安全性即可。

src/main/javacom/okta/authorizationapp/configuration/创建类SecurityConfiguration

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().passwordEncoder(passwordEncoder()).withUser("john.doe").password(passwordEncoder().encode("secret")).roles("USER");}@Beanpublic PasswordEncoder passwordEncoder() {return passwordEncoder;}
}

此类将确保用户必须登录才能访问您的应用程序。 现在只有一个名为john.doe用户可以登录该应用程序。

通过调用AuthorizationAppApplication内部的main方法来运行应用程序。 您也可以从命令行运行它。 在项目文件夹中,运行以下命令:

mvn spring-boot:run

当您访问http://localhost:8080 ,应该看到以下登录页面:

键入john.doesecret作为用户名和密码。 您应该被重定向到主页。 第一次访问时,只有Welcome, john.doe! 将显示。 在第二次访问中,您还应该看到最后一次访问:

现在,您有了一个管理安全性的应用程序。 做得好!

但是,有一个大问题……现在您只能以一个用户身份登录。 更糟糕的是,用户信息被硬编码在您的应用程序中。 为了简化用户访问和安全性,您可以使用Okta来管理身份验证。 它将在5分钟内为您提供一种非常简单的方法来与OAuth 2.0集成。 让我们在示例应用中配置OAuth 2.0,以了解它的简易性。 首先创建一个Okta帐户。

创建一个Okta帐户

如果您没有Okta帐户, 请继续创建一个 。 注册后,请执行以下步骤:

  • 登录到您的帐户
  • 单击应用程序 > 添加应用程序

您将被重定向到以下页面:

  • 选择网站 ,然后单击下一步。

在表格中填写以下选项:

  • 名称: hello-world
  • 基本URI: http://localhost:8080
  • 登录重定向URL: http://localhost:8080/login/oauth2/code/okta
  • 允许的授予类型:
    • 客户凭证
  • 单击完成

现在,您可以使用Okta应用程序对应用程序的用户进行身份验证。

使用OAuth 2.0:一种快速,专业的方法

首先,将Okta的库添加到您的项目中。

转到pom.xml并添加Okta的Spring Boot启动器:

<dependency><groupId>com.okta.spring</groupId><artifactId>okta-spring-boot-starter</artifactId><version>1.3.0</version>
</dependency>

Okta将管理您的应用程序身份验证,因此您可以删除SecurityConfiguration类。

HomeController ,进行以下更改:

@GetMapping("/")
public String getCurrentUser(@AuthenticationPrincipal OidcUser user, Model model) {String email = user.getEmail();model.addAttribute("email", email);model.addAttribute("lastAccess", usersLastAccess.get(email));model.addAttribute("firstName", user.getGivenName());model.addAttribute("lastName", user.getFamilyName());usersLastAccess.put(email, LocalDateTime.now());return "home";
}

您的端点现在将收到与OAuth 2.0兼容的OidcUser 。 此类提供了比以前更多的用户信息,因此您可以修改HTML以显示它。 用email替换username ,并添加firstNamelastName ,这是您之前没有的字段。 为此,请转到hello.html并进行以下更改:

<body><h1 th:text="'Welcome, ' + ${email} + '!'"></h1><ul><li th:if="${lastAccess}" th:text="'Last access: ' + ${lastAccess}"></li><li th:if="${firstName}" th:text="'First name: ' + ${firstName}"></li><li th:if="${lastName}" th:text="'Last name: ' + ${lastName}"></li></ul>
</body>

您仍然像以前一样向用户打招呼,但同时还显示来自端点的新信息。 您已经对所有代码进行了更改,现在只需要添加一些配置即可。 使用以下环境变量在应用程序的根目录中创建okta.env文件。

export OKTA_OAUTH2_ISSUER=https://{yourOktaDomain}/oauth2/default
export OKTA_OAUTH2_CLIENT_ID={CLIENT_ID}
export OKTA_OAUTH2_CLIENT_SECRET={CLIENT_SECRET}

您可以在Okta信息中心的应用程序页面中找到{CLIENT_ID}{CLIENT_SECRET} 。 要访问它,请按照以下步骤操作:

  • 在您的Okta仪表板中,转到“ 应用程序”
  • 选择hello-world应用程序
  • 单击常规选项卡

您应该在“客户端凭据”区域中看到两个值。 您的{yourOktaDomain}将显示在Okta仪表板中,只需单击菜单中的“ 仪表板 ”即可。 您将在右上角看到组织URL。

将这些值粘贴到okta.env ,运行以下命令以启动您的应用程序。

source okta.env
mvn spring-boot:run

而已!

启用OAuth 2.0登录到您的Spring应用程序

导航到http://localhost:8080 。 您的应用程序会将您重定向到Okta的登录页面:

登录后,您将被重定向到您的应用程序,并看到以下消息:

你完成了! 在5分钟内,您只需很少的配置即可在应用程序中添加OAuth 2.0。

了解有关Spring Security,Spring Boot和Java身份验证的更多信息

如果要查看完整的源代码,可以在GitHub上访问它。

您是否想全面了解OAuth 2.0和Java? 您可能对以下文章感兴趣:

  • Spring Boot登录选项快速指南
  • 具有PreAuthorize的Spring方法安全性
  • 使用Spring Boot Actuator监视Java应用程序

有关此类文章的更多信息, 请在Twitter上关注@oktadev 。 我们还定期将截屏视频发布到我们的YouTube频道 。

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。


翻译自: https://www.javacodegeeks.com/2019/12/oauth-2-0-java-guide-secure-your-app-in-5-minutes.html

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

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

相关文章

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者&#xff1a;SHERlocked93转发链接&#xff1a;https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代&#xff0c;如今已发展到前后端分离&#xff0c;这种开发方式大大提升了前后端项目的可维护性与开发…

成为Java流大师–第1部分:创建流

在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;可提供出色的代码指标。 通过本动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整个想法是代表一个…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲&#xff1a;1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足&#xff0c;某些代码会被反复多次的执行。条件不成立了&#xff0c;循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…

事件触发控制_SystemVerilog线程控制与通信

01线程控制1.概述线程&#xff0c;即独立运行的程序&#xff1b;线程需要被触发执行&#xff0c;可以结束或者不结束&#xff1b;在module中的initial和always&#xff0c;都可以看作独立的线程&#xff0c;他们在仿真0时刻开始&#xff0c;而选择结束或者不结束&#xff1b;在…

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书&#xff1f; 当我很久以前第一次面对这个问题时&#xff0c;我以为以后会做&#xff0c;但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言&#xff0c;而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式&#xff0c;并学习如何使用Java流对RDBMS数据库执行声明性查询&#xff0c;而无需编写任何SQL代码。 您会发现&#xff0c;Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至&#xff0c;Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难&#xff0c;有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容&#xff0c;误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;例如&#xff1a; 给…

使用测微计收集应用程序指标

什么是千分尺&#xff1f; 千分尺是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0c;Elastic&#xff0c;JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种&#xff1a;内排序和外排序。在排序过程中&#xff0c;全部记录存放在内存&#xff0c;则称为内排序&#xff0c;如果排序过程中需要使用外存&#xff0c;则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类&#xff1a;(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后&#xff0c;充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格&#xff0c;而且型号也是一样的。那么&#xff0c;我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里&#xff0c;我们再次使用JMetro的另一个版本。 此版本中的新增功能&#xff1a; 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者&#xff1a;NanBox保活现状我们知道&#xff0c;Android 系统会存在杀后台进程的情况&#xff0c;并且随着系统版本的更新&#xff0c;杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的&#xff0c;因为可以节省内存&#xff0c;降低功耗&#xff0c;也避免…

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后&#xff0c;发现PPPoE连接不上&#xff0c;显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍&#xff1a;pppoe错误怎么解决无线路由器设置PPPoE拨号后&#xff0c;PPPoE拨号连接不上&#xff0c;不能够上…