使用Spring Boot和Auth0来实现简单的身份验证和授权(RBAC)
首先
本文将描述如何在 Auth0 的 ID Token 和 Spring Boot 中实现基于角色的访问控制(RBAC)的方法。
实现的方法
模仿 MP-JWT,并将权限信息作为自定义声明添加到 ID Token 中。
为 Auth0 的 ID Token 添加权限信息
在 Auth0 的 ID Token 中不附带权限信息。
但可以通过自定义声明将权限信息添加到 ID Token 中。
在 Auth0 中设置用户、角色和权限。
根据Auth0文档的指示,为Auth0用户设置权限信息。
由于不使用Access Token,因此无需进行与Access Token相关的权限授权设置。
在Auth0的身份令牌中定义自定义声明
在Auth0的仪表板上打开规则,定义向ID令牌添加自定义声明的规则。
自定义声明的名称必须是URL格式的字符串。
在本例中,名称为http://example.com/permissions。
function (user, context, callback) {
var map = require('array-map');
var ManagementClient = require('auth0@2.17.0').ManagementClient;
var management = new ManagementClient({
token: auth0.accessToken,
domain: auth0.domain
});
var params = { id: user.user_id, page: 0, per_page: 50, include_totals: true };
management.getUserPermissions(params, function (err, permissions) {
if (err) {
// Handle error.
console.log('err: ', err);
callback(err);
} else {
var permissionsArr = map(permissions.permissions, function (permission) {
return permission.permission_name;
});
context.idToken['http://example.com/permissions'] = permissionsArr;
}
callback(null, user, context);
});
}
根据ID Token的权限信息,在Spring Security中进行访问控制。
下面是一个从ID令牌中获取附加的授权信息,并将其用于访问控制的Spring Boot应用程序安全配置示例。
创建一个Spring Boot应用程序
使用Spring Initializer选择以下依赖关系并创建项目。

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
</dependencies>
JWT 认证服务器配置
只需要一种选择:
可以使用仅属性设置认证服务器的配置。
设置以下由Spring Security定义的属性。
属性設定値spring.security.oauth2.resourceserver.jwt.issuer-uri
https://
プレフィックスと /
サフィックスが付いた Auth0 ドメイン。末尾 /
を省略すると動かない。auth0.audienceAuth0 Application の Client ID。spring.security.oauth2.resourceserver.jwt.issuer-uri=https://YOUR_DOMAIN/
auth0.audience=YOUR_APP_CLIENT_ID
自定义索赔的获取设置
获取附加在 ID Token 自定义声明中的权限信息,并将其设置为安全主体(Security Principal)。
#Auth0 の Rules で定義したカスタムクレーム名
permissions.claim=http://example.com/permissions
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value(value = "${permissions.claim}")
private String permissionsClaim;
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/api/public").permitAll()
.mvcMatchers("/api/private").authenticated()
.mvcMatchers("/api/private-scoped").hasAuthority("read:messages")
.and().oauth2ResourceServer().jwt()
.jwtAuthenticationConverter(jwt -> new JwtAuthenticationToken(jwt,
jwt.getClaimAsStringList(permissionsClaim)
.stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList())));
}
}
只需要一个选项,请原生地用中文重新表达以下内容:
只需实现控制器,即可根据在Auth0中配置的权限信息进行访问控制。
可以通过Principal访问ID Token。(实现类如上述示例中的JwtAuthenticationToken)
请参考
我在本次投稿中参考了以下资料。
-
- Auth0のコア認証機能セットの使用方法 – Auth0 Docs
-
- Spring Security 5 Java API:承認 – Auth0 Docs
-
- IDトークンにユーザー権限を追加するにはどうすればよいですか? – Auth0 Community
-
- OAuth 2.0/OpenID Connectの2つのトークンの使いみち – Qiita
- MicroProfile JSON Web トークンの構成 – IBM Knowledge Center