You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Security的Access Token的scope声明中纳入Auth0权限?

问题1:Auth0是否有新的方法或配置可将permissions纳入Access Token的scope声明中?

有两种可行方案:

  • 用Auth0 Actions替代弃用的Rules:
    在Auth0控制台创建一个Post Login类型的Action,编写代码把permissions字段的内容追加到scope中。示例代码如下:

    exports.onExecutePostLogin = async (event, api) => {
      if (event.authorization && event.authorization.permissions) {
        // 将权限转为scope格式
        const permissionScopes = event.authorization.permissions.map(p => p.name);
        // 合并到现有scope
        const newScope = (event.request.body.scope || '').split(' ').concat(permissionScopes).join(' ');
        api.accessToken.setScope(newScope);
      }
    };
    

    创建完成后,把这个Action添加到你的登录流程即可生效。

  • 请求Token时显式指定权限为scope参数:
    前端请求Access Token时,直接把需要的权限作为scope参数的一部分传递(比如scope="openid read:advices write:advices"),Auth0会把这些权限同时写入scope和permissions字段。这种方式适合权限固定、前端明确知晓所需权限的场景。


问题2:若没有,是否存在替代方案,能在Spring Security中仍使用hasAuthority()或类似方法处理Token中的permissions?

可以通过自定义JwtAuthenticationConverter,把Token中的permissions字段转换成Spring Security认可的带"SCOPE_"前缀的Authority,这样就能继续用hasAuthority()校验。

具体实现步骤:

  1. 定义自定义转换器:
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class CustomJwtAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {

    private final JwtGrantedAuthoritiesConverter defaultConverter = new JwtGrantedAuthoritiesConverter();

    @Override
    public AbstractAuthenticationToken convert(Jwt jwt) {
        // 获取默认从scope字段生成的权限
        Collection<GrantedAuthority> authorities = defaultConverter.convert(jwt);
        // 从permissions字段提取权限,添加SCOPE_前缀
        List<GrantedAuthority> permissionAuthorities = jwt.getClaimAsStringList("permissions")
                .stream()
                .map(permission -> new SimpleGrantedAuthority("SCOPE_" + permission))
                .collect(Collectors.toList());
        // 合并两种权限
        authorities.addAll(permissionAuthorities);
        return new JwtAuthenticationToken(jwt, authorities);
    }
}
  1. 在Spring Security配置中注册该转换器:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authorize) -> authorize
                .requestMatchers("/api/public").permitAll()
                .requestMatchers("/api/private/**").authenticated()
                .requestMatchers("/api/private-scoped/**").hasAuthority("SCOPE_read:advices")
            )
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt
                    .jwtAuthenticationConverter(new CustomJwtAuthenticationConverter())
                )
            );
        return http.build();
    }
}

配置完成后,Token中的permissions会被自动转为符合要求的Authority,hasAuthority("SCOPE_read:advices")就能正常校验权限了。


内容的提问来源于stack exchange,提问作者Kavindu Nilshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:56:04