使用Spring Boot和Heroku在20分钟内完成Java的单点登录

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

大规模更新

我最初为本文撰写的代码更适合非Spring Boot环境。

Stormpath为其IDSite服务现有的Spring Boot集成使为其编写代码变得轻而易举 。 它利用了Spring Boot必须提供的所有自动配置。

如果您是新手,请继续阅读。 如果您以前阅读过它,请跳至“ 更新您的Spring Boot Webapp”部分。 您将看到RestrictedController从40行减少到15行,从4种方法减少到1行。

主赛事–轻松单点登录

我喜欢Java如何保持自我创新以保持最新和相关性(我可以听到我所有的Node.js和Ruby朋友吟)。 支持Java的生态系统也在跟上新的发展。 如今,就像在Python或Node.js中一样,构建,测试和部署丰富的Java Web应用程序变得如此容易(越来越难了)。

其中之一就是Spring Boot,它使在几分钟内构建和启动Java Webapp成为现实。 Heroku对Java支持的关注也加快了步伐。

最后,Stormpath意味着开发人员不必构建身份验证和授权工作流。 Stormpath的身份API和单点登录功能( 通过IDSite )提供了现成的帐户注册,登录,电子邮件工作流以及跨应用程序的单点登录。 这些流程包括默认表单和视图,所有这些都是可定制的。

在这篇文章中,我们将把所有这些放在一起,并在20分钟内在您的应用程序中获得单点登录的额外好处。

继续阅读-滴答滴答!

这是本教程所需的先决条件:

  • 摇篮2.x
    • 在Mac上: brew install gradle
  • Heroku
    • 创建一个Heroku帐户
  • 一个Stormpath帐户(我们还将在下面介绍)

注意 :您可以轻松使用Maven 。 如果您更喜欢此构建工具,则本文附带的源代码包括pom.xml

为了使其变得超级容易,我们在每个示例中都添加了一个方便的Heroku部署按钮,因此您可以立即看到它的运行情况。 如果您花了超过20分钟的时间,请在评论中告诉我们是什么阻止了您。 我们喜欢反馈。

启动Spring Boot – 5分钟教程

注意 :如果您已经对Spring Boot有所了解,则可以跳到下一部分。 在那里–我刚刚为您节省了5分钟。 别客气。

本节使用github存储库中的SpringBootBasic标签。

纽扣

Spring Boot使您能够启动一个功能全面的Java Web应用程序,就像启动一个简单的Java应用程序一样。 它具有main方法和所有内容。 例如, @SpringBootlApplication批注执行@Configuration @EnableAutoConfiguration@ComponentScan @EnableAutoConfiguration@ComponentScan批注(具有默认属性)在@EnableAutoConfiguration Spring应用程序中所做的所有操作。

令Spring Boot如此出色且如此轻松地工作的是Starter软件包,这些软件包增加了功能,包括默认配置。 我们将在Stormpath Spring Boot Thymeleaf Starter的所有Stormpath功能中进一步使用它们来创建新用户,登录和更改密码。 您要做的只是在build.gradlepom.xml文件中引用一个jar。

对于我们的基本示例,我们将包括核心Spring Boot Starter Web和Thymeleaf Spring Boot Starter。 Thymeleaf是现代HTML 5 Java模板引擎。

这是我们的build.gradle

buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")}
}apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'group = 'com.stormpath'
version = '0.1.0'sourceCompatibility = 1.8
targetCompatibility = 1.8repositories {mavenCentral()
}dependencies {compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'1.2.5.RELEASE'compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version:'1.2.5.RELEASE'
}

要使我们的基本Spring Boot应用程序正常运行,我们还需要三个文件。

IDSiteDemoApplication.java是应用程序的入口点:

package com.stormpath.idsite_demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class IDSiteDemoApplication {public static void main(String[] args) {SpringApplication.run(IDSiteDemoApplication.class, args);}
}

@SpringBootApplication批注设置了启动应用程序所需的所有配置。

HomeController.java映射URI并解析为Thymeleaf模板:

package com.stormpath.idsite_demo.controllers;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HomeController {@RequestMapping("/")public String home() {return "home";}
}

@Controller@RequestMapping批注将此类设置为控制器,并将其配置为处理/ URI上的请求。 只需将String home钩子返回到Thymeleaf模板体系结构中,即可将我们引到最终文件:

位于templates文件夹中的home.html是浏览至/时将呈现的模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"><head><th:block th:include="fragments/head :: head"/></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><h1>Hello!</h1></div></div></div></body>
</html>

注意 :您可能会注意到上面模板中的th:include指令。 这是Thymeleaf体系结构的一部分,用于将文件包含在其他文件中。 该示例的完整源代码包含templates/fragments/head.html文件。

那好吧 让我们通过启动最基本的Spring Boot应用程序来完善前5分钟。

gradle clean build可以解决问题。 然后: java -jar build/libs/idsite_demo-0.1.0.jar

build_it_one

为SpringBoot身份验证添加Stormpath

本节使用github存储库中的SpringBootStormpath标记。

纽扣

在本节中,我们将:

  • 创建一个Stormpath帐户
  • 生成Stormpath API密钥对
  • 将应用程序添加到您的Stormpath帐户
  • 更新您的Spring Boot网络应用程序以显示一些Stormpath应用程序信息
  • 点火并观看它的工作情况

创建一个Stormpath帐户

转到“风暴路径注册”页面 。 输入您的名字和姓氏,公司,电子邮件和密码。

spring-boot-heroku-register

单击注册。

点击收到的验证电子邮件中的链接。 然后,您将看到为您生成的租户名称。

spring-boot-heroku-login

登录。 做完了

注意 :有关多租户应用程序的更多信息,我们上面有一个方便的博客文章 。

生成Stormpath API密钥对

登录到Stormpath帐户后,您将看到以下屏幕:

弹簧启动heroku仪表板

单击Create API Key按钮。

api_key

单击Create API Key按钮并保存文件。

存储在该文件中的API密钥用于向Stormpath验证您的应用程序。 在该文件中,有一个apiKey.idapiKey.secret 。 您永远都不想暴露apiKey.secret 。 因此,例如,您永远不需要将api密钥文件签入git存储库。 稍后当我们部署到Heroku时,我将向您展示如何配置您的应用程序以使用api密钥,而不必将它们存储在git存储库中。

Stormpath使用详细记录的配置默认值,以使我们的API的使用变得异常简单。 这些默认值之一是api密钥文件位置。 Java SDK将自动在您的主目录中查找文件:

~/.stormpath/apiKey.properties

如果将下载的文件复制到该路径,则不需要其他配置即可从应用程序连接到Stormpath。

将应用程序添加到您的Stormpath帐户

返回管理控制台,点击“应用程序”标签。

应用领域

您会注意到已经存在两个应用程序: My ApplicationStormpath 。 他们在注册Stormpath时自动设置。 如果没有定义任何其他Stormpath应用程序,则Spring Boot应用程序不需要进一步的配置。 默认情况下,它将连接到已定义的“ My Application实例。

但是,这里的最终目标是获得一些Single Signon的好处,为此,我们需要多个应用程序才能登录。

因此,让我们创建另一个Stormpath应用程序。 单击Create Application按钮。

new_application

让我们在这里分解选项。

名称和(可选)描述不言自明。 而且,我们希望此应用程序已启用是有意义的。

默认情况下,“ Create new Directory复选框处于选中状态。 对于我们的示例,我未选中此选项。 相反,我已经选中了“将Map Account Stores to this Application复选框,并选择了“ My Application Directory 。 最后,我单击了“ DEFAULT ACCOUNT LOCATION和“ DEFAULT GROUP LOCATION单选按钮。

那么,这是怎么回事? Stormpath的组织方式,应用程序可以使用任意数量的目录作为其帐户存储。 Stormpath目录只是包含帐户和组的存储桶。 为了我们的目的,我们可以使用注册后为我们自动创建的目录My Application Directory 。 在下面的“奖励”部分,我将向您展示如何创建特定类型的目录以将Google身份验证添加到您的应用。 剧透警报:超级容易。

更新您的Spring Boot Webapp

让我们将基本的Spring Boot应用程序连接到Stormpath,以显示一些Stormpath应用程序信息。 这将为能够与ID网站服务集成奠定基础。

看看我们的HomeController

package com.stormpath.idsite_demo.controllers;@Controller
public class HomeController {@AutowiredApplication app;@RequestMapping("/")public String home(Model model) {model.addAttribute("appName", app.getName());model.addAttribute("appDescription", app.getDescription());return "home";}
}

现在,我们利用了Spring的@Autowired功能,为我们提供了Stormpath Application对象的句柄。 使用它,我们在Model对象中设置应用程序的名称和描述,并将其传递给我们的模板。

这将我们带入下一个更改,即home.html Thymeleaf模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"><head><th:block th:include="fragments/head :: head"/></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><h1 th:inline="text">Hello! Welcome to App: [[${appName}]]</h1><h3 th:inline="text">[[${appDescription}]]</h3></div></div></div></body>
</html>

使用Thymeleaf表示法将信息拉出模型,我们正在引用[[${appName}]][[${appDescription}]]

最后,我们将进行一个小(但功能强大)的更新以build.gradle文件。 我们正在更改此行:

compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version:'1.2.5.RELEASE'

对此:

compile group: 'com.stormpath.spring', name: 'spring-boot-starter-stormpath-thymeleaf', version:'1.0.RC4.5'

我们已经将Spring的Thymleaf Spring Boot Starter换成Stormpath的了。 这是很酷的一点:该Starter中包含了与Stormpath Java SDK交互所需的一切。

我们的应用程序文件中总共更改了7行,并且添加了一个文件application.properties以开始挂接到Stormpath。

构建您的Java Web应用程序

我们在这里需要的其他一点信息是您创建的Stormpath应用程序的URL。

您可以通过导航到“应用程序”,从管理仪表板中找到此文件。

application_id

假设您将api密钥文件放在~/.stormpath/apiKey.properties的默认位置,这是运行此示例所需的全部工作:

gradle clean build
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/6bHOGj63WM8cfC2nhD3Pki \java -jar build/libs/idsite_demo-0.1.0.jar

当然,您需要放入自己的STORMPATH_APPLICATION_HREF

app_info

您可以看到浏览器中的页面现在正在显示来自我们创建的Stormpath应用程序的信息。

使用IDSite的Stormpath单点登录…

…你猜到了。 五分钟内。

本节使用github存储库中的SpringBootStormpathIDSite标记。

纽扣

您可能有向应用程序添加身份验证和授权的经验。 也许您是预先完成的。 也许那是您说过要达成的目标-最终。 无论哪种方式,这都很痛苦。 而且,它与您要解决的问题无关。 但是,这是至关重要且必要的。

在本节中,我们将添加以下功能:创建新用户,登录,将页面访问权限限制为仅那些已登录用户和更改密码。 并且,我们将以最少的编码和最少的配置来做到这一点。

标识站点配置

首先,我们将从管理控制台设置IDSite。 单击“ ID站点”选项卡。

id_site_1

滚动时,您会发现有许多字段带有标签Upgrade Required 。 基本ID网站功能可与我们的免费套餐一起使用,我们将在稍后看到。 具有自定义域或自定义用于身份验证的模板需要付费订阅。

在这里,我们只是要更新两个字段并保存设置。

id_site_2

为了安全起见,您必须指定一个允许与ID网站建立连接的URL列表。

在“ Authorized Javascript Origin URLs字段中输入http://localhost:8080

出于安全原因,您必须指定授权重定向URL的列表。

Authorized Redirect URLs字段中输入http://localhost:8080/并在另一行中输入http://localhost:8080/idSiteResult

单击Save按钮。 这就是配置ID站点以在应用程序中启用身份验证和授权所必需的。

让我们退后一步,用5分钟中宝贵的30秒时间来查看ID网站背后的机制。

当用户尝试访问您网站的受限区域时,如果他们尚未拥有有效的会话,他们将被重定向到您的ID网站。

他们将看到一个熟悉的登录表单,其中包含用于创建新用户和重置其密码的选项。

id_site_login

这个是从哪里来的? 这是魔术吗? 这是使用ID Site的一部分-通常通常自己编写的所有身份验证和授权流程。 不好。 (哎呀,这有点苛刻。但是,认真的说,由于身份验证代码实施不当,您多久阅读一次有关安全漏洞的信息?)

身份验证后,它们将被重定向回您指定的URL,并将能够访问该受限内容。

您的用户似乎完全熟悉此过程-甚至平凡。 您只需很少的配置或编码即可完成此任务。

更新您的Spring Boot Webapp

启用对您的Spring启动应用程序IDSite是在一个单一的财产处理application.properties 。 我们还将另外两条线来控制流。

stormpath.web.idSite.enabled = true
stormpath.web.login.nextUri = /restricted/secret
stormpath.web.logout.nextUri = /?status=logout

第1行为您的应用程序启用IDSite。 对。 这就是全部!

IDSite具有默认的标准身份验证流。 默认情况下,在验证用户身份之后, /login重定向到/ ,在会话被销毁后, /logout重定向到/login?status=logout

对于我们的应用程序,一旦用户通过身份验证,我们希望他们重定向回/restricted/secret 。 而且,一旦用户注销,我们将以状态logout将他们重定向回前门。 上面的第2行和第3行完成了此操作。

我们在home.html模板中添加了一行,以启动整个登录流程:

<a class="btn btn-success" href="/restricted/secret">Click here for a secret message.</a>

我们将在一个新的控制器中添加大约15行代码(总计)以挂接到ID Site。
让我们看一下该控制器RestrictedController.java

package com.stormpath.idsite_demo.controllers;@Controller
public class RestrictedController {@AutowiredApplication app;@Value("#{ @environment['stormpath.sso.cross.link'] ?: '/' }")private String crossLink;@Value("#{ @environment['stormpath.sso.message.primary'] ?: 'Primary' }")private String messagePrimary;@Value("#{ @environment['stormpath.sso.message.secondary'] ?: 'Secondary' }")private String messageSecondary;@RequestMapping("/restricted/secret")public String secret(HttpServletRequest request, Model model) {Account account = AccountResolver.INSTANCE.getAccount(request);if (account == null) {return "redirect:/login";}model.addAttribute("appName", app.getName());model.addAttribute("crossLink", crossLink);model.addAttribute("messagePrimary", messagePrimary);model.addAttribute("messageSecondary", messageSecondary);return "restricted/secret";}
}

让我们分解一下:

第8、11和14行使用标准的Spring工具来注入值。

引用环境变量ala @environment['stormpath.sso.message.primary']提取在applications.properties中找到的属性。

这是最重要的部分:Stormpath具有用于将系统环境变量转换为应用程序环境变量的内置工具。 这使我们在诸如Heroku之类的部署环境中设置环境变量非常容易。

它是这样工作的:将系统环境变量转换为小写,并将下划线替换为句点。

因此, STORMPATH_SSO_MESSAGE_PRIMARY被转换为stormpath.sso.message.primary

crossLink用于单点登录的环境。 此变量保存指向IDSite中设置的另一个应用程序的受限页面的完全限定URL。

messagePrimarymessageSecondary用于设置在受限页面上显示的消息。

这三个变量使我们可以将相同的代码库部署到多个Heroku应用程序,并在受限页面上显示不同的消息。

以下是IDSite的幕后故事:

  1. 在主页上,单击“ Click here for a secret message. 链接到/restricted/secret
  2. 根据@RequestMapping注释输入RestrictedControllersecret方法。
  3. 由于尚未建立会话,因此account变量将显示为null
  4. 根据第22行的条件,您将被重定向到/login页面。
  5. 登录页面由您的IDSite托管。
  6. 输入凭据并单击“ Login按钮后,您将被重定向回您的应用程序。
  7. 您的Spring Boot应用程序会自动处理IDSite重定向回的/idSiteResult回调。
  8. 基于在设置applications.properties ,内置IDSite回调处理程序将重定向到/restricted/secret
  9. 这次,有一个会话, account变量将不会为null
  10. 最后,将返回restricted/secret模板。

第6行和第10行之间的所有重定向都在眨眼之间发生。

让我们看一下新模板, restricted/secret.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"><head><title>Hello World!</title><th:block th:include="fragments/head :: head"/></head><body><div class="container-fluid"><div class="row"><div class="box col-md-6 col-md-offset-3"><div class="stormpath-header"><img src="http://stormpath.com/images/template/logo-nav.png"/></div><h1 th:inline="text">[[${appName}]] App</h1><h1 th:inline="text">Hey, [[${account.fullName}]]</h1><h3 th:utext="${messagePrimary}">Primary</h3><h4 th:utext="${messageSecondary}">Secondary</h4><a class="btn btn-danger" href="/logout">Log Out</a><a class="btn btn-success" href="/">Go Home</a><a class="btn btn-warning" th:href="@{${crossLink}}">SSO: Jump to Other Site</a></div></div></div></body>
</html>

从与ID网站进行交互的角度来看,这里有两行有趣的内容。

<h1 th:inline="text">Hey, [[${account.fullName}]]</h1>

该行访问AccountfullName属性,该属性在传入模板的模型中自动设置。

<a class="btn btn-danger" href="/logout">Log Out</a>

/logout端点由IDSite自动处理,并销毁现有会话。

启动您的Webapp并试用

像以前一样启动应用程序:

gradle clean build
STORMPATH_APPLICATION_HREF=https://api.stormpath.com/v1/applications/6bHOGj63WM8cfC2nhD3Pki \java -jar build/libs/idsite_demo-0.1.0.jar

由于我们尚未在Stormpath目录中定义任何用户,因此让我们创建一个新用户,然后确保我们可以以该用户身份登录和注销。

首先,浏览到前门: http://localhost:8080

受限家庭

单击友好的绿色按钮。

id_site_login

点击Create an Account链接。

创建帐号

单击友好的绿色按钮。

受限制的

头晕! 我们进来了!

如果现在单击绿色按钮,将带您回到主页。 如果然后单击主页上的绿色按钮,则将直接转到受限页面。 您将不会再看到登录表单。 这是因为您建立了有效的会话。

登录

如果单击红色按钮,您将注销并重定向到主页。 单击绿色按钮将您带入会话,这将再次使您进入登录表单。

您可能会注意到,创建帐户后,我们将立即登录并发送到受限页面。 您可以通过在Stormpath管理控制台中要求电子邮件验证作为帐户创建过程的一部分来放慢速度。

注意 :存在一个已知问题,您无法在同一会话中登录到Stormpath Admin仪表板并使用ID Site进行身份验证。 我们正在努力尽快解决此问题。 它永远不会影响您的用户,因为它们永远不会出现在您的Stormpath Admin仪表板中。 目前,使用Stormpath Admin Dashbaord时,请使用单独的浏览器配置文件或单独的浏览器实例。

在5分钟内使用Heroku进行单点登录

本节使用github存储库中的SpringBootStormpathIDSite标记。

纽扣

注意 :如果要测试SSO而不自行部署,则可以使用上方的Heroku Deploy按钮部署两个不同的Heroku Apps。

! 回家舒展! 那么,我一直在听到这么多的SSO是什么? 有了我们建立的基础,我们现在可以将该Web应用程序的多个实例部署到Heroku。 所以呢? 我会告诉你“那又怎样!”

我们可以部署Web应用程序的多个实例虽然很新颖,但真正赋予它强大功能的是ID Site的单一登录功能。 在本节结束时,您将看到通过登录该Web应用程序的一个实例,您可以浏览到该Web应用程序的另一个实例的受限页面, 无需再次登录。

首先,我们需要添加一个文件,以便Heroku知道如何启动我们的应用程序。 这是一个单行的Procfile

web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/*.jar

注意bash样式变量: $PORT 。 这是由Heroku自动填充的,不需要我们明确设置。

让我们设置和部署一个Heroku应用程序,并确保一切正常

heroku apps:create idsite-demo-app1 --remote idsite-demo-app1

注意命令末尾的--remote 。 Heroku自动将git远程添加到本地存储库,以便能够部署您的应用程序。 默认情况下,此遥控器将命名为heroku 。 由于我们将部署该应用程序的多个实例,因此我们需要不同的远程名称。

现在我们已经创建了应用程序,我们需要设置一些配置参数。 这是秘密秘诀的一部分,它使我们可以部署相同的代码库,但将Web应用程序链接到不同的Stormpath应用程序。

heroku config:set \STORMPATH_API_KEY_ID=<your api key id> \STORMPATH_API_KEY_SECRET=<your api key secret> \STORMPATH_APPLICATION_HREF=<your app href> \STORMPATH_SSO_CROSS_LINK=https://idsite-demo-app2.herokuapp.com/restricted/secret \STORMPATH_SSO_MESSAGE_PRIMARY="The secret is that chocolate is delicious"'!' \STORMPATH_SSO_MESSAGE_SECONDARY="Yummy"'!' \
--app idsite-demo-app1

假设您已经将另一个名为idsite-demo-app2应用程序部署到了Heroku。 该应用程序的受限页面上使用STORMPATH_SSO_CROSS_LINK链接到其他应用程序。 一切设置正确后,您无需再次登录。 这就是单点登录的强大功能!

还记得我之前说过的Stormpath如何进行自我配置的好处之一是,您无需在代码中嵌入敏感的api密钥信息吗? 这就是所有的地方。 在上面的命令中,我们为Heroku实例设置环境变量。 Stormpath SDK自动检查STORMPATH_API_KEY_IDSTORMPATH_API_KEY_SECRETSTORMPATH_APPLICATION_HREF环境变量是否存在。 如果存在,则SDK与API交互时将自动使用这些环境变量中的值。 这就是将我们的Spring Boot Web应用程序连接到正确的Stormpath应用程序的原因。

好。 设置好舞台。 让我们部署我们的应用程序!

git push idsite-demo-app1 master

这会产生大量输出,但让我们看一下其中的一些亮点:

remote: Compressing source files... done.        
remote: Building source:        ...remote:        [INFO]                                                                                 
remote:        [INFO] ------------------------------------------------------------------------        
remote:        [INFO] Building demo 0.0.1-SNAPSHOT        
remote:        [INFO] ------------------------------------------------------------------------        ...remote:        [INFO] Installing /tmp/build_a7299c4194f003c6e3730e568a540e82/target/demo-0.0.1-SNAPSHOT.jar to /app/tmp/cache/.m2/repository/com/stormpath/idsite_demo/demo/0.0.1-SNAPSHOT/demo-0.0.1-SNAPSHOT.jar        remote:        [INFO] ------------------------------------------------------------------------        
remote:        [INFO] BUILD SUCCESS        
remote:        [INFO] ------------------------------------------------------------------------        ...remote: -----> Discovering process types        
remote:        Procfile declares types -> web        
remote: 
remote: -----> Compressing... done, 63.6MB        
remote: -----> Launching... done, v6        
remote:        https://idsite-demo-app1.herokuapp.com/ deployed to Heroku        
remote: 
remote: Verifying deploy.... done.        
To https://git.heroku.com/idsite-demo-app1.git* [new branch]      master -> master

最底层,Heroku正在基于我们的Procfile发现进程类型。 在这种情况下,它是web

我们第一个应用程序的最后一项工作是将ID Site配置为接受来自它的连接并重定向到它。 跳回到ID站点的管理仪表板,并将https://idsite-demo-app1.herokuapp.com添加到授权Javascript原始URL列表中,然后添加https://idsite-demo-app1.herokuapp.com/https://idsite-demo-app1.herokuapp.com/idSiteResult到授权重定向URL列表。

id_site_3

确保单击屏幕底部的“ Save按钮。

并且, https ://idsite-demo-app1.herokuapp.com/准备就绪! 一探究竟。 创建一个帐户。 登录并注销。 玩得开心。

现在,我们到达了SSO应许之地的大门。 这就是所有要做的事情:

  • 创建另一个Stormpath应用程序
  • 创建另一个Heroku应用程序
  • 设置新的Heroku应用程序的配置
  • 将我们的Spring Boot应用程序部署到新的Heroku应用程序
  • 更新我们的ID网站,以包括用于授权来源和重定向的新URL

我们只是在漂洗并重复我们以前所做的事情。

让我们创建新的Stormpath应用程序:

new_application_2

请注意,我们正在为此新应用程序映射相同的帐户存储。

是时候创建一个新的Heroku应用程序了

heroku apps:create idsite-demo-app2 --remote idsite-demo-app2

并且,配置它:

heroku config:set \STORMPATH_API_KEY_ID=<your api key id> \STORMPATH_API_KEY_SECRET=<your api key secret> \STORMPATH_APPLICATION_HREF=<your app href> \STORMPATH_SSO_CROSS_LINK=https://idsite-demo-app1.herokuapp.com/restricted/secret \STORMPATH_SSO_MESSAGE_PRIMARY="The secret is that ice cream is delicious"'!' \STORMPATH_SSO_MESSAGE_SECONDARY="Yummy"'!' \
--app idsite-demo-app2

确保使用新创建的Stormpath应用程序的完整URL。

部署时间:

git push idsite-demo-app2 master

最后,ID网站URL更新:

id_site_4

现在,您可以在待办事项列表上选中以下复选框:构建和部署SSO应用程序。 你完成了!

so

您可以登录到https://idsite-demo-app1.herokuapp.com 。 然后,您可以直接跳至https://idsite-demo-app2.herokuapp.com/restricted/secret ,而无需再次登录!

祝您满意!

在本文中,您已经创建了一个Spring Boot Web应用程序,该应用程序启用了具有Stormpath的ID站点服务的Single Sign-On。 Stormpath托管登录表单以及与创建新用户和重置密码相关的所有其他链接和表单。

通过一个控制器中的少量代码,您就可以为您的应用程序认证和授权用户。 您可以使用Heroku快速部署它。 我很乐意听到您使用本文中的示例的经验。

如果您有兴趣在Spring Boot中使用Stormpath的更多功能,这是我们的Spring Boot Webapp示例快速入门

随意到掉线电子邮件或以我个人随时随地。

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

立即注册按钮

翻译自: https://www.javacodegeeks.com/2016/10/single-sign-java-20-minutes-spring-boot-heroku.html

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

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

相关文章

OO第一次单元总结

第一次总结性博客 16071070 陈泽寅 2019.3.23 一、第一单元所学总结 首先先来总结一下第一单元我所学到的知识以及所感所悟。第一个单元&#xff0c;是我第一次接触JAVA语言&#xff0c;并且再使用了几次之后&#xff0c;就被这门语言的独有的魅力以及简便的用法所深深吸引。下…

汇编语言学习笔记(十二)-浮点指令

浮点数如何存储浮点寄存器浮点数指令浮点计算例子浮点高级运算CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数&#xff0c;从寄存器到指令&#xff0c;都有一套独特的处理流程&#xff0c;浮点单元也称作x87 FPU。 现在看浮点数的表示方式&#xff0c;我们所知道的&a…

人工智能简述

人工智能研究的方向之一&#xff0c;是以所谓 “专家系统” 为代表的&#xff0c;用大量 “如果-就” &#xff08;If - Then&#xff09; 规则定义的&#xff0c;自上而下的思路。   人工神经网络 &#xff08; Artifical Neural Network&#xff09;&#xff0c;标志着另外…

Mockito 的使用

转自&#xff1a;Mockito 中文文档 ( 2.0.26 beta ) 转自&#xff1a;手把手教你 Mockito 的使用 参数匹配器 Argument Matcher(参数匹配器) Mockito通过equals()方法&#xff0c;来对方法参数进行验证。但是有时候我们需要更加灵活的参数需求&#xff0c;比如&#xff0c;匹配…

以SYSTEM用户运行CMD

在SCCM 经常会以NT AUTHOR\SYSTEM帐户操作。 安以下步骤可以以SYSTEM帐户打开一个CMD窗口。 1. 从微软网站下载PSTool。 2. 以管理员运行CMD&#xff0c;进入到解压的PSTool目录。 3. 运行psexec -i -s cmd.exe 4. 在新打开的CMD中运行whoami。 注&#xff1a;这个指令可以让你…

matlab cell

如果p为一个数&#xff0c;那么h(1)p,是没有问题的。 如果p为一个向量&#xff0c;那么h(1,:)p是没有问题的。 如果p是一个矩阵的话&#xff0c;上面的两种赋值方法都是会有错误的。 那么要如何处理呢&#xff1f; 这时就用到了cell数据类型了。cell的每个单元都可以存储任何数…

jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章

jboss 不适用内置日志现在与HornetQ合作已经快4年了&#xff0c;我认为现在该分享我到目前为止所学的部分知识了。 这篇文章的主要目的不是重写官方文档 &#xff0c;而是以简单的方式阐明我们在PaddyPower中最常用的概念。 什么是HornetQ HornetQ是JMS实现。 JMS是一种面向…

Spring Cloud微服务笔记(四)客户端负载均衡:Spring Cloud Ribbon

客户端负载均衡&#xff1a;Spring Cloud Ribbon 一、负载均衡概念 负载均衡在系统架构中是一个非常重要&#xff0c;并且是不得不去实施的内容。因为负载均衡对系统的高可用性、 网络压力的缓解和处理能力的扩容的重要手段之一。通常所说的负载均衡指的是服务端负载均衡&#…

matlab cell,fix,floor,round取整的几种方式

ceil函数的作用是朝正无穷方向取整&#xff0c;即将m/n的结果向正无穷方向取整&#xff0c;如m/n3.12&#xff0c;则ceil(m/n)的结果为4。 类似的函数有如下几个&#xff1a; fix&#xff1a;朝零方向取整&#xff0c;如fix(-1.3)-1;fix(1.3)1; floor&#xff1a;朝负无穷方…

孤儿进程与僵尸进程[总结]

1、前言 之前在看《unix环境高级编程》第八章进程时候&#xff0c;提到孤儿进程和僵尸进程&#xff0c;一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程&#xff0c;会带来什么问题&#xff0c;怎么解决&#xff0c;我只停留在概念上面&#xff0c;没有深入&a…

使用CloudForms实现云运营幸福感的3个步骤

本周宣布&#xff0c; Cloud Suite管理层的最新功能 CloudForms 4.2可供所有人使用。 产品增加了1800多种改进&#xff0c;令许多令人兴奋的新奇事物令人兴奋。 CloudForms是Cloud Suite产品的Cloud Management平台&#xff0c;使您能够跨区域联合部署它以进行集中管理操作&am…

leetcode 599. 两个列表的最小索引总和(Minimum Index Sum of Two Lists)

目录 题目描述&#xff1a;示例 1:示例 2:解法&#xff1a;题目描述&#xff1a; 假设Andy和Doris想在晚餐时选择一家餐厅&#xff0c;并且他们都有一个表示最喜爱餐厅的列表&#xff0c;每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如…

FAR,FRR,EER

FRR与FARFRR&#xff08;False Rejection Rate&#xff09;和FAR&#xff08;False Acceptance Rate&#xff09;是用来评估指纹识别算法性能的两个主要参数。FRR和FAR有时被用来评价一个指纹识别系统的性能&#xff0c;其实这并不贴切。指纹识别系统的性能除了受指纹算法的影响…

通过一段汇编,加深对寄存器ESP和EBP的理解

一直对寄存器ESP和EBP的概念总是有些混淆&#xff0c;查看定义ESP是栈顶指针&#xff0c;EBP是存取堆栈指针。还是不能很透彻理解。之后借于一段汇编代码&#xff0c;总算是对两者有个比较清晰的理解。下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码;假设执…

Redis和数据库 数据同步问题

Redis和数据库同步问题缓存充当数据库比如说Session这种访问非常频繁的数据&#xff0c;就适合采用这种方案&#xff1b;当然了&#xff0c;既然没有涉及到数据库&#xff0c;那么也就不会存在一致性问题&#xff1b;缓存充当数据库热点缓存读操作目前的读操作有个固定的套路&a…

matlab fspecial创建滤波算子

Fspecial函数用于创建预定义的滤波算子&#xff0c;其语法格式为&#xff1a;h fspecial(type) h fspecial(type,parameters,sigma)参数type制定算子类型&#xff0c;parameters指定相应的参数&#xff0c;具体格式为&#xff1a;typeaverage&#xff0c;为均值滤波&#xff…

hibernate jpa_JPA / Hibernate:基于版本的乐观并发控制

hibernate jpa本文是对Hibernate和JPA中基于版本的乐观并发控制的介绍。 这个概念已经很老了&#xff0c;上面已经写了很多东西&#xff0c;但是无论如何我都看到了它被重新发明&#xff0c;误解和滥用。 我在写它只是为了传播知识&#xff0c;并希望引起对并发控制和锁定的兴趣…

X86汇编快速入门

本文翻译自&#xff1a;http://www.cs.virginia.edu/~evans/cs216/guides/x86.html 本文描述基本的32位X86汇编语言的一个子集&#xff0c;其中涉及汇编语言的最核心部分&#xff0c;包括寄存器结构&#xff0c;数据表示&#xff0c;基本的操作指令&#xff08;包括数据传送指令…

Django(三)框架之第二篇

https://www.cnblogs.com/haiyan123/p/7717788.html 一、知识点回顾 1、MTV模型 model&#xff1a;模型&#xff0c;和数据库相关的 template&#xff1a;模板&#xff0c;存放html文件&#xff0c;模板语法&#xff08;目的是将变量如何巧妙的嵌入到HTML页面中&#xff09;。 …

使用GDB调试C库

用gdb调试程序时&#xff0c;一般的函数都可以step进去&#xff0c;可是C库函数却直接跳过了。 网上找了些资料&#xff0c;记录一下&#xff01; 1.安装C库的debug版本 [plain] view plaincopy print?sudo apt-get install libc6-dbg 安装完后&#xff0c;在/usr/lib目录下…