Spring Filter为来自令牌的请求添加角色

时间:2017-06-10 01:22:54

标签: java spring authentication jwt keycloak

我正在寻找添加基于角色的身份验证的正确方法,我从JWT中提取角色。

理想情况下,我想在身份验证发生后从JWT中提取角色。这将通过检查Web令牌以查找与我们从身份验证系统中获得的角色相关的某些字段(keycloak)来实现。

我的问题是:是否可以将角色附加到请求,然后使用http配置来要求其中一个提取的角色?

以下是一些相关代码,有助于解释我正在做的事情。

在我的WebSecurityConfigurer中,我根据请求确定了访问令牌的可用范围。

@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public AccessToken accessToken() {
    try {
        HttpServletRequest request =
            ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest();
        return ((KeycloakSecurityContext) ((KeycloakAuthenticationToken) request
            .getUserPrincipal())
            .getCredentials()).getToken();
    } catch (Exception exc) {
        return null;
    }
}

然后我覆盖了configure方法中http的一些配置。

http
// Disable session management
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// Allow calls to OPTIONS
.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.and()
// Authenticate every other call
.authorizeRequests().anyRequest().authenticated()
.and()
.csrf().disable();

理想情况下,我想要达到的目标是:

http.antMatchers("/foo").hasRole("jwt_extracted_role")

我目前正在创建自定义过滤器,从令牌中提取角色,然后检查正确的角色,但这可能比它需要的更麻烦。

关于我应该覆盖哪些配置类的方法以从请求中提取角色并将它们添加到请求中的任何指针?

1 个答案:

答案 0 :(得分:0)

我最终通过覆盖KeycloakAuthenticationProvider并在WebSecurityConfig中将我的覆盖类作为bean提供来解决此问题。我的课程如下:

public class ResourceAwareAuthenticationProvider extends KeycloakAuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
          ... here I add granted authorities from the token's credentials ...
    }
}

然后在我的class WebSecurityConfigurer extends KeycloakWebSecurityConfigurerAdapter中覆盖AuthenticationProvider:

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return new ProviderManager(Lists.newArrayList(new ResourceAwareAuthenticationProvider()));
}

这允许我进行如下配置:

http.authorizeRequests()
    .antMatchers("/**").hasAuthority("my-resource-authority")