文章原地址
问题
当gateway充当OAuth2ResourceServer的时候,会出现hasRole配置无效的问题。
原因来自于ServerHttpSecurity.OAuth2ResourceServerSpec.JwtSpec
中默认的ReactiveAuthenticationManager
没有将jwt中authorities 的负载部分当做Authentication的权限。
简而言之,我们需要把jwt 的Claim中authorities的值加入 这里有个人提出了这个问题,但是官方认为仅仅使用scope``scp
这两个字段当做权限就足够了github issue
解决方案
我们重新定义一个ReactiveAuthenticationManager
权限管理器 默认的权限管理器使用jwtGrantedAuthoritiesConverter
作为默认的转换器,就是这个转换器默认只读取"scope", "scp"这两个作为权限。
JwtGrantedAuthoritiesConverter源码
来看源码,源码不长。
convert
方法可以理解为转换器的调用入口,从这个方法开始看
/**
* Extracts the {@link GrantedAuthority}s from scope attributes typically found in a
* {@link Jwt}.
*
* @author Eric Deandrea
* @since 5.2
*/
public final class JwtGrantedAuthoritiesConverter implements Converter<Jwt, Collection<GrantedAuthority>> {
private static final String DEFAULT_AUTHORITY_PREFIX = "SCOPE_";
private static final Collection<String> WELL_KNOWN_AUTHORITIES_CLAIM_NAMES =
Arrays.asList("scope", "scp");
private String authorityPrefix = DEFAULT_AUTHORITY_PREFIX;
private String authoritiesClaimName;
/**
* Extract {@link GrantedAuthority}s from the given {@link Jwt}.
*
* @param jwt The {@link Jwt} token
* @return The {@link GrantedAuthority authorities} read from the token scope