15分钟内使用Twilio和Stormpath在Spring Boot中进行身份管理

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

今天,不到30秒左右的时间,我就能建立一个Twilio帐户并使用httpie向自己发送一条短信。 再花几分钟的时间(少于5分钟),我有一个Spring Boot应用程序在做同样的事情。

在大约同样的五分钟内,您可以使用Stormpath的身份管理作为服务平台进行设置,并学习热衷于身份验证。

我们真正生活在非我的计算机(云)服务的黄金时代。

您可以想象在过去15年中使用计算机或其他设备所做的任何事情,现在您可以注册并在几分钟内获得概念证明。 我记得大约在2007年的某个时候(在iPhone 1之后)与SMS经纪人交谈。 在完成了一大堆文书工作,等待了大约四个月并准备大量资金之后,我们准备使用SMS网关编写代码。 那时,这是一些不可思议的东西。

曾经尝试推出自己的身份管理吗? 你给哈希加盐了吗? 或者,只要承认这一点–您就像其他人一样以纯文本形式存储密码。

在本文中,我们将把Stormpath和Twilio放在一起。 情况如下:当用户从新设备登录时,我们希望向他们发送一条SMS通知以告知他们。 今天,这是使人们了解其帐户活动的一种常见做法。 如果我收到来自新地址的登录通知,但不是我,那么我知道我的帐户已被盗用。

twilio投机白1024x388

为了演示的目的,我们将考虑从新设备访问新的IP地址。

这篇文章的代码可以在这里找到。

设置风暴路径

第一步是创建一个Stormpath帐户。 您可以在此处关注我们的快速入门文档。 这些是基本步骤:

  • 在Stormpath.com注册
  • 点击确认电子邮件中的链接
  • 创建一个API密钥以用于API访问(将其保存到: ~/.stormpath/apiKey.properties

设置Stormpath Spring Boot集成

此示例的源代码可以在此处找到。

现在,不用担心Twilio的东西-默认情况下它是禁用的。 在下一部分中,我们将集成并启用Twilio。

通过Stormpath Spring Boot集成,可以轻松地在用户登录之前和之后触发其他操作。此机制是我们稍后用来发送Twilio消息的机制。 现在,我们仅要确保登录后处理程序正在运行。

要使用Stormpath Spring Boot集成,您只需要包含一个依赖项:

<dependency><groupId>com.stormpath.spring</groupId><artifactId>stormpath-thymeleaf-spring-boot-starter</artifactId><version>${stormpath.version}</version>
</dependency>

在这种情况下,我们将使用Spring Boot + Web MVC + Thymeleaf集成,以便我们可以返回Thymeleaf模板。

要设置我们的postLoginHandler ,我们只需要创建一个暴露一个bean的Spring Boot配置:

@Configuration
public class PostLoginHandler{...@Bean@Qualifier("loginPostHandler")public WebHandler defaultLoginPostHandler() {return (HttpServletRequest request, HttpServletResponse response, Account account) -> {log.info("Hit default loginPostHandler with account: {}", account.getEmail());return true;};}
}

您可以像这样启动Spring Boot应用程序:

mvn clean install
mvn spring-boot:run

现在,您可以浏览到: http://localhost:8080/register在Stormpath中创建一个帐户。 然后,您可以浏览到: http://localhost:8080/login 。 您应该在日志输出中看到以下内容:

2016-09-14 22:37:18.078  ... : Hit default loginPostHandler with account: micah@stormpath.com

头晕! 我们的登录后挂钩正在运行。

在此示例中,我们正在建模的用例是每当用户从新位置登录时向用户发送文本消息(SMS)。 为此,我们需要用户的电话号码。 我们还需要存储他们已登录的位置的数组,以便我们确定他们是否正在从新位置登录。

输入Stormpath CustomData 。 我们很早就知道我们无法捕获客户可能拥有的用户数据的所有用例。 因此,我们为每个一流的Stormpath对象(包括用户帐户)附加了10MB的自由格式JSON数据。 那就是CustomData

我们像这样存储用户的信息:

{"loginIPs": ["0:0:0:0:0:0:0:1","104.156.228.126","104.156.228.136"],"phoneNumber": "+15556065555"
}

这是Stormpath管理控制台中的外观:

54721858

一旦我们将Twilio应用到组合中,我们将回到如何设置CustomData方式。

设置Twilio

Twilio的快速入门可以使您快速启动并运行。

基本步骤如下:

  • 输入一些基本的注册信息
  • 输入你的电话号码
  • 提供Twilio电话号码
  • 测试您可以将消息从Twilio电话号码发送到您的电话号码

确保您运行测试并且可以发送消息。 您可以使用curl或httpie从命令行自己进行测试 :

http -f POST \
https://api.twilio.com/2010-04-01/Accounts/<account sid>/Messages.json \
To=<recipient +1...> From=<your twilio phone # - +1...>  Body="Hello there..." \
--auth <account sid>:<auth token>

现在您知道可以使用您的Twilio帐户了,将它作为依赖项添加到Spring Boot应用程序中很容易:

<dependency><groupId>com.twilio.sdk</groupId><artifactId>twilio-java-sdk</artifactId><version>(6.0,6.9)</version>
</dependency>

绑在一起

之前,我们将Spring Boot应用程序设置为在用户成功登录后执行一项操作。该操作只是记录一些信息。 现在,我们将整合使用相同的登录后处理程序发送Twilio消息的功能。

@Bean
@Qualifier("loginPostHandler")
public WebHandler twilioLoginPostHandler() {return (HttpServletRequest request, HttpServletResponse response, Account account) -> {log.info("Account Full Name: " + account.getFullName());CustomData customData = account.getCustomData();String toNumber = (String) customData.get(phoneNumberIdentifier);List<String> loginIPs = getLoginIPs(customData);String ipAddress = getIPAddress(request);if (loginIPs.contains(ipAddress)) {// they've already logged in from this locationlog.info("{} has already logged in from: {}. No message sent.", account.getEmail(), ipAddress);} else {boolean messageSent = TwilioLoginMessageBuilder.builder().setAccountSid(twilioAccountSid).setAuthToken(twilioAuthToken).setFromNumber(twilioFromNumber).setToNumber(toNumber).send("New login for: " + account.getEmail() + ", from: " + ipAddress);// only save the ip address if the twilio message was successfully sentif (messageSent) {saveLoginIPs(ipAddress, loginIPs, customData);}}return true;};
}

第8行和第9行检索用户的电话号码以及该用户以前登录过的地址的列表。 它从用户的CustomData提取此信息。

假设他们正在从新位置登录,则第18行将新地址保存回CustomData ,第20行触发Twilio消息。

TwilioLoginMessageBuilder在示例中定义,并使用一个流畅的界面。

上面第26行使用的send方法首先检查以确保正确配置了Twilio,如果是,则尝试发送消息:

TwilioRestClient client = new TwilioRestClient(accountSid, authToken);List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("To", toNumber));
params.add(new BasicNameValuePair("From", fromNumber));
params.add(new BasicNameValuePair("Body", msg));MessageFactory messageFactory = client.getAccount().getMessageFactory();
try {Message message = messageFactory.create(params);log.info("Message successfuly sent via Twilio. Sid: {}", message.getSid());return true;
} catch (TwilioRestException e) {log.error("Error communicating with Twilio: {}", e.getErrorMessage(), e);return false;
}

让我们启动该应用程序并查看其运行情况!

mvn clean installTWILIO_ACCOUNT_SID=<your twilio account sid> \
TWILIO_AUTH_TOKEN=<your twilio auth token> \
TWILIO_FROM_NUMBER=<your twilio phone number> \
TWILIO_ENABLED=true \
java -jar target/*.jar

点击前门http://localhost:8080 ,您就有机会登录。如果查看日志,您会发现第一次登录时,您没有收到消息,因为没有您备案的电话号码。

7161604

15149852

2016-09-15 16:48:31.621  INFO: Account Full Name: micah silverman
2016-09-15 16:48:31.750  WARN: No toNumber set. Cannot proceed.

接下来要做的是设置电话号码:

34509960

现在,您可以注销并再次登录,您应该会收到Twilio通知:

22712755

2016-09-15 16:53:44.599  INFO: Account Full Name: micah silverman
2016-09-15 16:53:46.080  INFO: Message successfully sent via Twilio. Sid: SM9cd7fdfa3f8f463dbdd8f16662c13b5b

51977529

协同增效!

在本文中,我们采用了Stormpath的登录后处理程序功能,并将其与Twilio的SMS功能相结合,以产生新的功能,这要比这两个平台分别可以完成的功能大。

绝对是服务的黄金时代。

在本文的代码存储库中,还使用了更多的Spring Boot魔术,包括基于配置设置动态加载defaultLoginPostHandlertwilioLoginPostHandler 。 要使用Twilio处理程序,只需在application.properties文件中设置twilio.enabled=true属性。

现在,继续将一些服务粘合在一起,以获得乐趣和收益!

学到更多

有兴趣了解更多有关使用Spring Boot和Stormpath进行用户身份验证的信息吗? 我们还有其他一些很棒的资源可供您查看:

  • 通过Spring启动和Stormpath进行OAuth 2.0令牌管理
  • 使用Spring Boot和Heroku在20分钟内完成Java的单点登录
  • 5个构建Spring Boot API的实用技巧

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

立即注册按钮

翻译自: https://www.javacodegeeks.com/2016/10/identity-management-spring-boot-twilio-stormpath-15-minutes.html

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

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

相关文章

Spark系列之:使用spark合并hive数据库多个分区的数据到一个分区中

Spark系列之&#xff1a;使用spark合并hive数据库多个分区的数据到一个分区中 把两个分区的数据合并到同一个分区下把其中一个分区的数据通过append方式添加到另一个分区即可 %spark val df spark.sql("select * from optics_prod.product_1h_a where datetime202311142…

window下查看dll, lib文件是32位还是64位

工具&#xff1a;dumpbin.exe 依赖&#xff1a;link.exe, mspdb100.dll 命令&#xff1a; dumpbin /headers E:\math.dll 结果&#xff1a; Dump of file E:\math.dll PE signature found File Type: DLL FILE HEADER VALUES 14C machine (x86) -----…

【转载】分布式之redis复习精讲

注&#xff1a; 本篇文章转自&#xff1a;分布式之redis复习精讲 引言 为什么写这篇文章? 博主的《分布式之消息队列复习精讲》得到了大家的好评&#xff0c;内心诚惶诚恐&#xff0c;想着再出一篇关于复习精讲的文章。但是还是要说明一下&#xff0c;复习精讲的文章偏面试准备…

转动风车java_java实现-图的相关操作

importjava.util.LinkedList;public classGraph {private int vertexSize;//顶点的数量private int[] vertexs;//顶点数组private int[][] matrix;//矩阵private boolean[] isVisited;//是否访问过private static final int MAX_WEIGHT 1000;public Graph(intvertexSize){this…

java和golang性能_Java本质和性能

java和golang性能最初的问题是如何计算二进制数中1的个数&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比较&#xff0c;该性能可以转换为固有特性&#xff0c;即单个机器代码指令POPCNT和执行相同功能的Java代码。 题 如何计算二进制数中1的个数…

开源GIS库GDAL/GEOS在Windows下的编译与 Codeblocks配置

最近在研究开源GIS库GDAL&#xff0c;我是采用自己下载源码编译的方式&#xff0c;主要进行以下几个步骤&#xff1a; 编译GEOS&#xff0c;参考自GEOS的wiki 下载GEOS源代码&#xff0c;目前的版本为3.5.0&#xff0c;解压到C盘根目录。打开VS2012自带的命令行工具 进入geo…

Java中.setvalue(-1)_Java State.setValue方法代碼示例

本文整理匯總了Java中org.eclipse.core.commands.State.setValue方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java State.setValue方法的具體用法&#xff1f;Java State.setValue怎麽用&#xff1f;Java State.setValue使用的例子&#xff1f;那麽恭喜您, 這裏精…

使用自定义线程池处理并行数据库流

并行数据库流 在我以前的文章中 &#xff0c;我写了关于使用并行流和Speedment并行处理数据库内容的信息。 在许多情况下&#xff0c;并行流可能比通常的顺序数据库流快得多。 线程池 Speedment是一个开源的Stream ORM Java工具包和Runtime Java工具&#xff0c;它将现有的数…

GDAL编译Windows平台下64位的方式

最近写的项目需要在64位的服务器上&#xff0c;结果32位下编译的不能用&#xff0c;只好重新编译一套64位的。在编译GDAL时&#xff0c;出现了连接错误&#xff0c;如下&#xff1a; LINK : error LNK2001: unresolved external symbol > _OCTNewCoordinateTransformation a…

CentOS7.x以上版本配置DNS失效解决办法

这2周做实验&#xff0c;centos7.x经常出现yum安装软件包的时候找不到解析地址&#xff0c;提示如下错误 正在尝试其它镜像。Error downloading packages: pam-devel-1.1.8-22.el7.x86_64: [Errno 256] No more mirrors to try. libcom_err-1.42.9-12.el7_5.x86_64: [Errno 256…

java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

>>#1 票数&#xff1a;41 已采纳使用slf4j无法做到这slf4j 。我想&#xff0c;缺少这个功能的原因是&#xff0c;几乎不可能为slf4j构建一个Level类型&#xff0c;它可以有效地映射到Facade后面所有可能的日志记录实现中使用的Level (或等效)类型。 或者&#xff0c;设计…

使用Cloudformation集成Spring Boot和EC2

在之前的博客中&#xff0c;我们将Spring Boot应用程序与Elastic beantalk集成在一起。 该应用程序是一个基于Servlet的应用程序&#xff0c;可以响应请求。 在本教程中&#xff0c;我们将部署一个Spring Boot应用程序&#xff0c;该应用程序在ec2实例上执行一些计划的任务。 …

出现$ref的原因及解决方案

$ref的产生原因 &#xff08;1&#xff09;重复引用&#xff1a;一个集合/对象中的多个元素/属性都引用了同一个对象 &#xff08;2&#xff09;循环引用&#xff1a;集合/对象中的多个元素/属性在相互引用导致循环 针对fastjson的处理 fastjson作为一款序列化引擎&#xff0c;…

Wireshark图解教程(简介、抓包、过滤器)

Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据&#xff0c;并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样&#xff0c;Wireshark也使用pcap network library来进行封包捕捉。可破解局域网内QQ、邮箱、msn、账号等的密码&am…

php格式书写,PHP书写格式详解(必看)

从一个例子开始。启动编辑器&#xff0c;创建一个php文件并键入如下代码&#xff1a;echo "你好&#xff01;";?>将该文件命名为 test.php 并存储于 E:html 目录下。在浏览器地址栏里访问该 php 文件&#xff1a;http://127.0.0.1/test.php&#xff0c;输出结果如…

java java se_Java SE 11:推动Java前进

java java se介绍 在我看来&#xff0c;这篇文章提出了Java语言应该如何发展成为一种首选语言。 它还提供了一些我喜欢但是有时&#xff08;可能永远不会&#xff09;成为Java的一部分的功能&#xff0c;出于某些原因&#xff0c;我将对此加以解释&#xff0c;这些功能有时我已…

用GDAL/OGR去读shapefile

一、读shapefile 1、首先&#xff0c;用Arcgis创建所要读的shp文件。打开ArcCatalog,右键NEW->Shapefile&#xff0c;名称Name:point &#xff0c;要素类型&#xff08;Feature Type&#xff09;:Point。点击Edit&#xff0c;选择投影类型。 2、打开ArcMap. 单击工具栏里的A…

【日 志】

/// <summary>/// 记录执行sql时的错误日志/// <para>cmdTxt 执行的sql</para>/// <para>inputParams 传入的Hashtable参数</para>/// </summary>private static void LogLastError(string cmdTxt, Hashtable inputParams){try{StringBuil…

php 数组移除指定健,php删除数组指定键的方法

php删除数组指定键的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后定义一个“array_remove”方法&#xff1b;最后利用“array_key_exists”、“array_search”等函数实现删除数组指定键即可。PHP删除Array数组里指定的key/*** php除数组指定的key值(直接删除k…

Intellij IDEA社区版中的SpringBoot入门

我们可以使用Intellij IDEA社区版来处理SpringBoot应用程序&#xff0c;因为我们不需要配置Tomcat&#xff0c;Wildlfy等服务器&#xff0c;只需运行main&#xff08;&#xff09;方法即可运行应用程序。 但是&#xff0c;Intellij IDEA社区版中没有提供直接创建SpringBoot应用…