@Value批注在AbstractAuthenticationProcessingFilter过滤器中返回空值

时间:2018-06-20 16:44:18

标签: spring-boot spring-security

我正在开发具有Spring安全性的springboot应用程序。 我正在尝试使自定义身份验证筛选器从application.properties文件读取某些属性而没有成功。

我已经读过this other question,虽然类似,但是处在不同的上下文中(与spring安全过滤器无关)。失败的原因对我来说很有意义,但是我尝试了使用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();
    }



}

1 个答案:

答案 0 :(得分:1)

无需在过滤器类中使用@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
        //...
    }