使用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选择以下依赖关系并创建项目。

image.png
<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-urihttps:// プレフィックスと / サフィックスが付いた 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
bannerAds