使用Spring Boot + Azure AD B2C来实现身份验证
使用Spring Boot + Azure AD B2C来实施认证
之前的文章提到了 Azure 向导的 Spring Boot Starter,现在我想解释一下如何使用 Azure Active Directory B2C 的库进行身份验证。除此之外,还有一些其他库,我希望在另一篇文章中解释。
Azure专用的Spring Boot入门 | Microsoft文档
Azure Active Directory B2C 需要将原生语言转化为中文,只需要一种选项:
Azure 租户 B2C
Azure AD B2C 是为 B2C 客户提供认证和身份管理等服务的服务,被称为所谓的 IDaaS(身份管理即服务)。
Azure Active Directory B2C 是一种身份验证服务,由 Microsoft 提供。
在详细讨论之前,请收集相关文件。您可以通过与社交账户关联或使用任何邮件地址进行注册、登录、以及进行个人资料管理等操作。B2C可以免费使用一定数量的用户。在本文中,我们不会重点讨论B2C本身,请参考以下内容进行创建。
创建Azure Active Directory B2C租户的教程 | Microsoft文档
Spring Boot使用Azure AD B2C库。
目前, azure-spring-boot-starter-active-directory-b2c:3.3.0 是最新版本。由于版本已经升级到3.0系列,并且之前的库名已更改为azure-active-directory-b2c-spring-boot-starter,请注意。在搜索时可能会遇到旧的教程,并且配置细节可能略有不同。
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
<version>3.3.0</version>
</dependency>
请使用 https://start.spring.io/ 从头开始创建一个Spring Boot项目,选择Web、Azure Active Directory、Thymeleaf和Security作为依赖关系。
最终需要以下的依赖关系。为了在View层使用自定义标签,我们添加了thymeleaf-extras-springsecurity5,但本文不对此进行解释。请查看最后介绍的GitHub示例的View。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
所需配置
我们将进行以下的B2C设置。
应用程序的注册
注册认证应用程序信息。如果不需要部署特别的话,只需要将重定向URL设置为http://localhost:8080/login/oauth2/code/就可以了。
我应该能够获取到以下的信息。
-
- テナントサーバーのURL
-
- クライアントID
- クライアントシークレット
用户流程
在B2C业务中,我们需要事先定义好用户登录和注册的流程。已经事先定义好的流程被称为”用户流程”,基于通用场景几乎都已经准备好了,您也可以进行一定程度的定制,这样非常方便。另外,我们还可以进行详细定制,但在这里不做具体介绍,如果您感兴趣的话,请自行查阅。
在B2C平台上定义用户流程,将以下三个流程定义并命名保存。
-
- サインイン、サインアップ フロー名
-
- プロファイル編集 フロー名
- パスワードリセット フロー名(任意)
适用于Spring Boot Starter的配置
由于Spring Boot Starter为我们提供了配置,所以我们可以通过设置以下属性来设置前面提到的信息。
azure:
activedirectory:
b2c:
base-uri: ${your-tenant-authorization-server-base-uri}
client-id: ${your-client-id}
client-secret: ${your-client-secret}
logout-success-url: ${you-logout-success-url}
user-flows:
password-reset: B2C_1_reset_password
profile-edit: B2C_1_edit_profile
sign-up-or-sign-in: B2C_1_signin
user-name-attribute-name: ${your-user-name-attribute-name}
应用程序的实现
在继承了WebSecurityConfigurerAdapter类的类中定义了要在哪个页面上设置认证。在下面的代码中,除了/login页面外,其他页面都被定义为需要认证,但请根据需要进行修改。
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
private final AADB2COidcLoginConfigurer configurer;
public WebSecurityConfiguration(AADB2COidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.apply(configurer);
}
}
我们还会准备一个控制器和页面,但在这里省略掉。
当你在控制器的参数中指定了OAuth2AuthenticationToken,它就会被自动注入,这样你就可以从中获取认证信息。以下是一个简单的示例。
private void initializeModel(Model model, OAuth2AuthenticationToken token) {
if (token != null) {
final OAuth2User user = token.getPrincipal();
model.addAllAttributes(user.getAttributes());
model.addAttribute("grant_type", user.getAuthorities());
model.addAttribute("name", user.getName());
}
}
@GetMapping(value = { "/", "/home" })
public String index(Model model, OAuth2AuthenticationToken token) {
initializeModel(model, token);
return "home";
}
执行,确认 (zhí , què
运行 ‘mvn clean spring-boot:run’ ,在本地访问 http://localhost:8080 ,将重定向到B2C的登录页面。
如果要将WebApps部署到B2C上,我认为只需正确设置重定向URL,然后进行部署即可使其运作。
总结
只需要提供一个选项:
使用B2C可以轻松进行认证,但需要理解B2C的设置等等,只要解决了这一点,就可以轻松实施认证。以前更加麻烦,所以提供库是很好的。在定制方面,也可以确认如何为B2C进行实施。
请参考以下SDK页面,在最后可以找到样本。
Azure SDK for Java的azure-spring-boot-sample-active-directory-b2c-oidc示例位于azure-sdk-for-java/sdk/spring/azure-spring-boot-samples/azure-spring-boot-starter-active-directory-b2c_3.3.0项目中。