spring boot httpsecurity-@preauthorize-如何设置authenticationfilter?

nkhmeac6  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(502)

我目前正在开发一个api授权。所以基本上我有一个过滤器 JwtAuthorizationFilter . 在我的restcontroller中,我想对应该通过 @PreAuthorize("hasRole('ADMIN')") 例如。所以我现在的问题是:如何设置 WebSecurityConfigureAdapter (或任何其他东西)将注解与jwtauthorizationfilter链接?

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Basically permit every request, but if needed (through @PreAuthorize) check via JwtAuthorizationFilter)
    }
}

谢谢您!向塞巴斯蒂安问好

rjjhvcjd

rjjhvcjd1#

目的 JwtAuthorizationFilter 应该是设置 Authentication 被授予权力。然后,springsecurity的默认方法security就足够了。
你有几个选择:

使用springsecurity的内置jwt支持

如果jwt是由授权服务器创建的,那么springsecurity的默认jwt支持就足够了。 Spring 安全船 BearerTokenAuthenticationFilter 以及 JwtAuthenticationProvider . 过滤器将解析 Authorization 头来获取令牌,提供者将验证令牌并构造 Authentication 这是基于 scope 或者 scp 索赔。如果那样的话,你会做一些 @PreAuthorize("hasAuthority('SCOPE_ADMIN')") .
如果您需要自定义如何将jwt声明转换为 GrantedAuthority s、 然后你可以发布一个
JwtAuthenticationConverter @Bean .
有关完整的安装细节,请参阅SpringSecurity的OAuth2.0资源服务器示例。不过,基本上,您的配置如下所示:

http
    .authorizeRequests((authz) -> authz
        .anyRequest().authenticated()
    )
    .oauth2ResourceServer((oauth2) -> oauth2
        .jwt(Customizer.withDefaults())
    );

在没有授权服务器的情况下使用springsecurity的内置jwt支持

springsecurity的现有支持在设计时考虑了授权服务器,但这不是一个要求。
相反,您可以让您的应用程序生成自签名令牌。

自己滚吧

你可以保留你的 JwtAuthorizationFilter ,但不清楚为什么springsecurity现有的支持不够。要添加过滤器,只需 addFilterBefore(myFilter, BearerTokenAuthenticationFilter.class) . 你可以看看 BearerTokenAuthenicationFilter 作为创建自己的过滤器时应考虑的一些事项的示例。

相关问题