java oauth2.0_OAuth 2.0 Java指南:5分钟保护您的应用程序安全

java oauth2.0

使用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安全性,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

java oauth2.0

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

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

相关文章

Java编程规范

一、常见命名规则 (1)匈牙利命名法 比 较著名的命名规则是匈牙利命名法&#xff0c;但这种命名法对于跨平台移植简直是灾难。这种命名方法是由Microsoft程序员查尔斯西蒙尼(Charles Simonyi) 提出的。其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利…

XML—— 验证XML文档

【0】README 0.0&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML—— 验证XML文档 的基础知识 0.1&#xff09;problemsolution &#xff08;干货——不推荐使用DOM 技术解析XML&#xff09; 0.1.1&#xff09;problem&#xff1a;如果仅仅按照…

计算机数据链路层教案,第三章 数据链路层(2) 新.ppt

文档介绍&#xff1a;计算机通信网20112011年教案年教案作者:段景山作者:段景山杨宁杨宁毛玉明毛玉明2第三章数据链路层??链路层功能链路层功能??成帧成帧??差错检测和纠正差错检测和纠正??差控与流控协议差控与流控协议??协议描述与验证协议描述与验证??示例示例?…

java导出javadoc文档

一、注释 (1)文档注释的格式化 生成的文档是 HTML 格式&#xff0c;而这些 HTML 格式的标识符并不是 javadoc 加的&#xff0c;而是我们在写注释的时候写上去的。比如&#xff0c;需要换行时&#xff0c;不是敲入一个回车符&#xff0c;而是写入 &#xff1c;br&#xff1e;&a…

java内核_测量时间:从Java到内核再到

java内核问题陈述 当您深入研究时&#xff0c;即使是最基本的问题也会变得很有趣。 今天&#xff0c;我想深入研究一下Java时间。 我们将从Java API的最基础知识开始&#xff0c;然后逐步降低堆栈&#xff1a;通过OpenJDK源代码glibc一直到Linux内核。 我们将研究各种环境下的性…

XML——文档类型定义(DTD-Document Type Definition)

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——文档类型定义&#xff08;DTD-Document Type Definition&#xff09; 的基础知识&#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTa…

职称计算机考试 数量,职称计算机考试WPS基础考点:自动求和

职称计算机考试WPS基础考点&#xff1a;自动求和导语&#xff1a;随着信息技术的发展&#xff0c;计算机日益走进人们的工作、学习和生活&#xff0c;成为专业技术人员不可或缺的工具。下面我们一起来看看职称计算机考试WPS的内容吧。1. 对不相邻单元格的数据求和假如要将单元格…

java静态导入

一、静态导入 在Java 5中&#xff0c;import语句得到了增强&#xff0c;以便提供甚至更加强大的减少击键次数功能&#xff0c;虽然一些人争议说这是以可读性为代价的。这种新的特性成为静态导入。当你想使用static成员时&#xff0c;可以使用静态导入&#xff08;在API中的类和…

java流写入数据库_成为Java流大师–第4部分:数据库流

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

XML——XML Schema

【0】README 0.0&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——XML Schema 的基础知识 &#xff1b;&#xff08;本文不涉及源代码&#xff0c; 很遗憾&#xff0c;以后会补充&#xff09; 【1】XML Schema 相关 1.0&#xff09;为什么引入…

怎么为pdf文件添加水印?

怎么为pdf文件添加水印&#xff1f;PDF是一种很好用的文件格式&#xff0c;这种格式能够很有效的保护我们的文件&#xff0c;但有时可能还会被破解&#xff0c;这种时候在PDF上添加水印就是比较好的方法。 综上所述&#xff0c;PDF是保密性很强的文件&#xff0c;但添加水印能够…

皖西学院计算机协会组织部,皖西学院

皖西学院关于卢义忠同志兼任安徽省高校后勤协会理事的请示安徽省委组织部:根据《关于进一步规范党政机关和企事业单位领导干部兼任社会组织职务审批管理的通知》(皖组通字〔2016〕40号)等文件精神&#xff0c;经皖西学院党委1月17日研究建议&#xff1a;因校领导分工调整&#…

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

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

java的for循环

一、普通for循环&#xff08;1&#xff09;for循环语法 for&#xff08;initialization; condition; update&#xff09;{statements;} &#xff08;2&#xff09;语法解释 1、for语句执行时&#xff0c;首先执行初始化操作&#xff08;initialization&#xff09;&#xff0c…

XML——使用 XPath来定位信息+使用命名空间

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——使用 XPath来定位信息使用命名空间 的基础知识 &#xff1b; 0.2&#xff09; for detailed XPath info &#xff1a; please visit ( http://www.ruanyifeng.com/blog/2009/…

计算机教室英语怎么读音,网络教室,network classroom,音标,读音,翻译,英文例句,英语词典...

多媒体教室1.多媒体教室基本组成多媒体教室由多媒体计算机、液晶投影机、数字视频展示台、中央控制系统、投影屏幕、音响设备等多种现代教学设备组成。(1)多媒体液晶投影机是整个多媒体演示教室中最重要的也是最昂贵的设备&#xff0c;它连接着计算机系统、所有视频输出系统及数…

算法一之简单选择排序

一、 选择排序的思想 选择排序的基本思想是&#xff1a;每一趟在n-i1&#xff08;i1&#xff0c;2&#xff0c;…n-1&#xff09;个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。简单选择排序的基本思想&a…

XML——流机制解析器

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——流机制解析器 的基础知识 &#xff1b; 0.2&#xff09; for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728 【1】XML——流机制…

第512章 河系量子计算机,第512章、河系量子计算机

69中文网 www.69zww.cc&#xff0c;最快更新分身投胎万界最新章节&#xff01;但AI智能所容身的量子计算机就大得有些恐怖了。其总体积丝毫不亚于一个小型河系&#xff01;什么是河系&#xff1f;银河系&#xff0c;仙女星系等等都是大小不等的河系&#xff01;而AI智能容身的量…

idea内置junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

idea内置junit5Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Sel…