spring-boot - @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();
}
}
解决方案
无需@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
//...
}
推荐阅读
- android - 在颤振提升按钮中设置宽度
- javascript - React useParams:在反应路由器中链接“用户名”时遇到问题
- javascript - 不和谐机器人(discord.js)中的错误消息?
- javascript - 不知道为什么 Portal 在我的代码中不起作用
- javascript - 选择的插件 - 在 .trigger("chosen:updated") 之后删除特定选项的“x”按钮(删除选项)
- processing - 处理 - 指定鼠标点击图像按钮的确切位置
- angular - 如何像使用 Promises 或 async/await 一样链接 observables?
- asp.net-core - B2C 注册和登录政策 - 自助重置密码重定向回更改密码
- python - sqlite3.OperationalError:靠近“<”:语法错误
- reactjs - 在 react-three-fiber/drei/Three.js 中两次使用相同的 GLTF 模型