使用Spring Boot、安全性和社交功能来实现与Twitter的登录
在这篇文章中所要解释的内容。
使用Spring Boot、Spring Security和Spring Social来实现社交登录。通过使用示例来解释如何实现。选择您感兴趣的章节进行阅读,因为可能会很长。
在这个样本中,不仅可以使用社交登录,还可以输入用户ID/密码进行登录。
这个词是指一个事件或过程的发展和演变。
我是通过学习Spring Boot和Spring Security第一次学习的。
在这本书中,我使用Spring Boot和Spring Security创建了一个可以登录/注销的名册应用程序,但我还想添加“通过Twitter登录”的功能,结果没想到遇到了很多困难…
为了消除这些困难,我决定写下这篇文章。
关于样本的事项
源代码
这是链接:https://github.com/PonzyPon/spring-boot-social-demo。
Sample-kun的能力
-
- 独自のID/Passwordでログインできます
-
- Twitterでログインできます
-
- Twitterでログインした際にそれがそのユーザーにとって初めてのログインだった場合、裏で暗黙的にユーザー登録をします
-
- ログインしたら、画面左上にそのユーザーの名前を表示できます
- サーバー側ロジックで現在ログイン中のユーザーのUserIdを取得できます UserContext#getUserId
样品先生无法做到的事情。
- ユーザー登録機能は実装していません。あらかじめV1__create-tables.sqlにてuser1というサンプルユーザーを作成しています
「Sample君的数据库设计」
在这个示例中,我希望实现使用独立的ID/密码登录和使用社交登录的两种方式。因此,我创建了两个表格。一个是用户的主表User表格,另一个是保存社交登录信息的UserConnection表格。User#user_id和UserConnection#userId是相同的值。我们使用这个值进行连接。
用户表
ログイン時にユーザーが入力するdisplay_nameVARCHAR
encoded_passwordVARCHAR
用户连接表
这个UserConnection表实际上已经基本固定。我自己没有编写任何操作这个表的源代码,全部交给了Spring来处理。在Spring框架中提供了类似这样的SQL示例供我们复制和使用。
源代码解释
在使用spring-security和spring-social时,我经常不太清楚我的责任在哪里。换句话说,很难确定Spring会处理哪些部分,而我应该处理哪些部分。因此,我将解释这个边界部分。
处理流程及其负责人
用户登录
Spring不会处理从数据库加载用户的部分。因此,需要实现UserDetailService接口。这样做后,该实现类会自动被调用,Spring会帮助执行用户的加载过程。
UserDetailsServiceImpl的源代码在这里。

社交登录
对于社交登录的情况,需要对保存着SNS账号信息的UserConnection表进行存在确认和数据的注册。然而,这一切都由Spring来处理。我们开发人员只需要负责创建用户和从User表中加载用户的操作即可。
ConnectionSignUpImpl的源代码在这里。
SocialUserDetailsServiceImpl的源代码在这里。

其他班级
注册服务和用户上下文不是必需的。
基本上,我們只想以最簡結構建立社交登錄的示例,所以不需要不必要的類別,例如不需要建立SignupService也沒關係。這個介面是我自己創建的,而在SignupServiceImpl#createUser的處理部分,也可以直接寫在ConnectionSignUpImpl#execute中。這次只是為了未來如果新增用戶註冊功能而將類別分開。另外,UserContext是一個便利的類別,可以方便地獲取登錄用戶的userId。即使沒有它,社交登錄也可以正常運作。
在SecurityConfig文件中进行了spring的配置。
我们刚才讨论过一个关于在接收用户名和密码后进行身份验证的处理交由Spring负责的问题,而这个设置是在SecurityConfig中进行的。
将解释内容到此为止。从这里开始,将解释如何操作和调整示例。
如何操作Sample君
如果您拥有自己的Twitter应用程序的Consumer Key和Consumer Secret,请从第三步开始。

如果在Twitter登录时出现错误,请首先尝试将Twitter应用程序的回调URL锁定设置更改为”否”。如果这样还不行,那就只能通过搜索引擎来解决了(^○^)
对于样品君的戏弄方式
登录Twitter后想要发推文。
在HomeController中,我创建了一个名为writeTweetIdIfLoggedInWithTwitter的方法,用于演示。如果用户已经通过Twitter进行了登录,那么我们会获取其账户时间线上最新的推文的tweetId,并将其输出到控制台上。通过使用变量twitter,我们还可以发布推文。请将代码中已经注释掉的示例取消注释,并尝试运行。
// Hello!! とツイートする
twitter.timelineOperations().updateStatus("Hello!!");
我希望获取当前登录用户的ID。
请调用UserContext#getUserId方法。由于可能没有任何用户登录,所以返回值是Optional。在使用时可以参考以下示例。
public class Sample {
@Autowired
private final UserContext userContext;
public Data getData() {
dao.getData(userContext.getUserId().get());
}
}
结束时
我按照制作这个样品之前的想法想象并写下了一篇让我看了会感到高兴的文章。如果有任何错误、意见或问题,请告知。就这样了。