我正在开发具有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();
}
}
答案 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
//...
}