如何在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()校验。
具体实现步骤:
- 定义自定义转换器:
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); } }
- 在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
相关产品推荐
相关产品推荐

