首页 > 解决方案 > @Value 注释在 AbstractAuthenticationProcessingFilter 过滤器中返回空值

问题描述

我正在开发一个带有spring security的springboot应用程序。我试图让我的自定义身份验证过滤器从 application.properties 文件中读取一些属性但没有成功。

我读过另一个类似但在不同上下文中的问题(与弹簧安全过滤器无关)。失败的原因对我来说很有意义,但我尝试了 DelegatingFilterProxy 建议的方式但没有成功(公平地说,我并没有真正理解添加到 Application 类的部分的含义)。另一个解决方案不适合我的情况,因为我没有任何 onStartup 方法可以覆盖。

这是我正在使用的代码:

public class JWTAuthenticationFilter extends
        AbstractAuthenticationProcessingFilter {

    @Value("${app.jwtSecret}")
    public String SECRET2;

在控制器类中几乎相同的代码可以正常工作:

@RestController
@RequestMapping("/api")
@CrossOrigin
@EnableAutoConfiguration
public class UsersController {

    @Value("${app.jwtSecret}")
    public String SECRET2;

但我不能让它在过滤器中工作。我正在使用springboot 2.0.3。

有什么建议吗?DelegatingFilterProxy 在这种情况下是正确的方法吗?在那种情况下,我可以遵循任何示例/文章吗?

谢谢,米歇尔。

更新: 要完全回答第一条评论,过滤器由以下类调用:

@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    private LdapAuthenticationProvider ldapAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/secureLogin").permitAll()
            .antMatchers(HttpMethod.GET, "/api").permitAll()
            .antMatchers("/api/**").authenticated()
            .and()
            .addFilterBefore(new JWTAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class)
            .addFilter(new JWTAuthorizationFilter(authenticationManager()))
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(ldapAuthenticationProvider);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }



}

标签: spring-bootspring-security

解决方案


无需@Value在过滤器类中使用:

public class JWTAuthenticationFilter extends
        AbstractAuthenticationProcessingFilter {

    private String secret;

    //... setter for secret

但是在配置类中注入秘密:

@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Value("${app.jwtSecret}")
    public String secret;

    //...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        JWTAuthorizationFilter jwtFilter = new JWTAuthorizationFilter(authenticationManager());
        //set secret
        //...
    }

推荐阅读