使用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.doe
和secret
作为用户名和密码。 您应该被重定向到主页。 第一次访问时,只有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
,并添加firstName
和lastName
,这是您之前没有的字段。 为此,请转到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