@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer = configurer;
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeHttpRequests()
.anyRequest().authenticated()
.and()
.apply(configurer);
// @formatter:on
return http.build();
从 aad-b2c-web-application 示例中复制home.html,并将 和 PASSWORD_RESET_USER_FLOW
替换为PROFILE_EDIT_USER_FLOW
之前使用的用户流名称。
生成并测试应用。 让我们 Webapp
在端口 8080 上运行。
通过 Maven 生成并启动应用程序后,请在 Web 浏览器中打开 http://localhost:8080/
。 应重定向到登录页。
选择包含登录用户流的链接。 系统应会重定向到 Azure AD B2C 以启动身份验证过程。
成功登录后,应会在浏览器中看到示例 home page
。
用法 2:访问资源服务器的 Web 应用程序
此方案基于 访问 Web 应用程序 方案,以允许应用程序访问其他资源。 此方案是 OAuth 2.0 客户端凭据授予 流。
从门户菜单中选择 “Azure AD B2C ”,选择“ 应用程序”,然后选择“ 添加”。
指定应用程序 名称 ((如 webApiA
) ),将 应用程序 ID 记录为 WEB_API_A_AZURE_CLIENT_ID
,然后选择“ 保存”。
从应用程序中选择 “密钥 ”,选择“ 生成密钥 以生成 WEB_API_A_AZURE_CLIENT_SECRET
”,然后选择“ 保存”。
从导航窗格中 选择“公开 API ”,然后选择“ 设置”。 将 应用程序 ID URI 记录为 WEB_API_A_APP_ID_URL
,然后选择“ 保存”。
从导航窗格中选择“ 清单 ”,然后将以下 JSON 段粘贴到数组中 appRoles
。 将 应用程序 ID URI 记录为 , WEB_API_A_APP_ID_URL
将应用角色的值记录为 , WEB_API_A_ROLE_VALUE
然后选择“ 保存”。
"allowedMemberTypes": [
"Application"
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
选择“ API 权限>”“添加权限>我的 API”,选择“ WebApiA 应用程序名称”,选择“ 应用程序权限”,选择“ WebApiA.SampleScope 权限”,然后选择“ 添加权限 ”以完成此过程。
授予管理员对 WebApiA 权限的同意。
基于 访问 Web 应用程序 方案添加以下依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
基于 访问 Web 应用程序 方案添加以下配置。
spring:
cloud:
azure:
active-directory:
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: ${AZURE_TENANT_ID}
authorization-clients:
${RESOURCE_SERVER_A_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_A_APP_ID_URL}/.default
Webapp
编写 Java 代码。
对于控制器代码,可以参考以下示例:
class Demo {
* Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
* @return Respond to protected data from WebApi A.
@GetMapping("/webapp/webApiA")
public String callWebApiA() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiA"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
安全配置代码与 访问 Web 应用程序 方案中的相同。 添加另一个 bean webClient
,如下所示:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
若要编写 WebApiA
Java 代码,请参阅 访问资源服务器 部分。
生成并测试应用。 让 Webapp
和 WebApiA
分别在端口 8080 和 8081 上运行。 Webapp
启动 和 WebApiA
应用程序。 成功登录后返回到主页。 然后, http://localhost:8080/webapp/webApiA
可以访问 以获取 WebApiA
资源响应。
用法 3:访问资源服务器
此方案不支持登录。 只需通过验证访问令牌来保护服务器,如果有效,它将为请求提供服务。
若要生成 WebApiA
权限,请参阅 用法 2:Web 应用程序访问资源服务器。
为 Web 应用程序添加 WebApiA
权限并授予管理员同意。
将以下依赖项添加到 pom.xml 文件。
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
添加以下配置。
spring:
cloud:
azure:
active-directory:
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: ${AZURE_TENANT_ID}
app-id-uri: ${APP_ID_URI} # If you're using v1.0 token, configure app-id-uri for `aud` verification
credential:
client-id: ${AZURE_CLIENT_ID} # If you're using v2.0 token, configure client-id for `aud` verification
编写 Java 代码。
对于控制器代码,可以参考以下示例:
class Demo {
* webApiA resource api for web app
* @return test content
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
@GetMapping("/webApiA/sample")
public String webApiASample() {
LOGGER.info("Call webApiASample()");
return "Request '/webApiA/sample'(WebApi A) returned successfully.";
根据安全配置代码,可以参考以下示例:
Spring Cloud Azure 4.x
Spring Cloud Azure 5.x
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated())
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
authenticationConverter.setJwtGrantedAuthoritiesConverter(new AadJwtGrantedAuthoritiesConverter());
// @formatter:off
http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(authenticationConverter);
// @formatter:on
return http.build();
生成并测试应用。 让我们 WebApiA
在端口 8081 上运行。 获取资源的访问令牌, webApiA
然后作为持有者授权标头进行访问 http://localhost:8081/webApiA/sample
。
用法 4:访问其他资源服务器的资源服务器
此方案是 访问资源服务器的升级,支持基于 OAuth2 客户端凭据流访问其他应用程序资源。
参考前面的步骤,我们将创建一个 WebApiB
应用程序并公开应用程序权限 WebApiB.SampleScope
。
"allowedMemberTypes": [
"Application"
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
授予管理员对权限的 WebApiB
同意。
在 访问资源服务器的基础上,将以下依赖项添加到 pom.xml 文件。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
基于 访问资源服务器 方案配置添加以下配置。
spring:
cloud:
azure:
active-directory:
credential:
client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}
authorization-clients:
${RESOURCE_SERVER_B_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_B_APP_ID_URL}/.default
编写 Java 代码。
WebApiA
对于控制器代码,可以参考以下示例:
public class SampleController {
* Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
* @return Respond to protected data from WebApi B.
@GetMapping("/webApiA/webApiB/sample")
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
public String callWebApiB() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiB"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
WebApiB
对于控制器代码,可以参考以下示例:
public class SampleController {
* webApiB resource api for other web application
* @return test content
@PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
@GetMapping("/webApiB/sample")
public String webApiBSample() {
LOGGER.info("Call webApiBSample()");
return "Request '/webApiB/sample'(WebApi B) returned successfully.";
安全配置代码与 访问资源服务器 方案相同,添加另一个 bean webClient
,如下所示
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
生成并测试应用。 让 WebApiA
和 WebApiB
分别在端口 8081 和 8082 上运行。 WebApiA
启动 和 WebApiB
应用程序,获取资源的访问令牌webApiA
,并将访问权限http://localhost:8081/webApiA/webApiB/sample
作为持有者授权标头。
有关详细信息,请参阅 spring-cloud-azure-starter-active-directory-b2c 示例。