java—如何将自定义主体添加到安全上下文并撤消添加spring安全jar的副作用

e3bfsja2  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(232)

热释光;博士;有没有更简单的方法将主体添加到spring引导安全上下文中?

我用的是Spring Boot(2.3.3)。我想通过授权头传入一个jwt令牌来验证使用firebase的用户。最初我的项目没有使用Spring Security 。我想使用一些现有的安全类,所以我添加了依赖项,结果发现我无法访问我的应用程序。
https://spring.io/guides/gs/securing-web/
如果spring security在类路径上,spring boot会自动使用“基本”身份验证保护所有http端点
我不想那样。
所以我遵循了这个指南https://docs.spring.io/spring-boot/docs/2.3.2.release/reference/htmlsingle/#boot-功能安全性
要完全关闭默认的web应用程序安全配置。。。添加类型为websecurityconfigureradapter的bean(这样做不会禁用userdetailsservice配置…)
要关闭userdetailsservice配置,可以添加userdetailsservice、authenticationprovider或authenticationmanager类型的bean。
我知道我必须实现一个过滤器,但是对于Spring Security 有一种特殊的方法
如果要将自定义筛选器添加到安全链中,则不需要将其设置为@bean,或者将其 Package 到显式禁用容器注册的filterregistrationbean中。
因此,我创建了websecurityconfigureradapter,以spring安全方式添加了我的过滤器,并创建了authenticationmanager和authenticationprovider @Bean 学生:

public class JwtAuthFilter extends GenericFilterBean { ...
    @Override
    public void doFilter( ...) {
        // ... security stuff to create the authentication object
        // This is the ONLY line I truly care about.
        SecurityContextHolder.getContext().setAuthentication(authToken);
        chain.doFilter(servletReq, servletResp);
    }
}

@Configuration
public class SecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // this seems like a good position to add it  ¯\_(ツ)_/¯
            .addFilterBefore(new JwtAuthFilter(), SecurityContextHolderAwareRequestFilter.class)
            .authorizeRequests()
            .anyRequest().authenticated();
    }

    @Bean
    public AuthenticationProvider getAuthenticationProvider() {
        return new JwtAuthProvider(); // impl omitted
    }

    @Bean
    public AuthenticationManager getAuthenticationManager() {
        return new JwtAuthManager(); // impl omitted
    }
}

对我来说,这似乎有点湿,但无论如何,这样做后,我的请求实际上击中了我的过滤器和默认的安全性是禁用的。但是authenticationmanager和provider中的代码从未运行过,我甚至不需要它(但我不希望有死代码……)。如果我真的需要它,我还缺什么?
有没有更简单的方法来实现我的目标(即在没有默认spring用户和启用基本身份验证的情况下向安全上下文添加自定义对象)。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题