我有一个通过JWT进行身份验证的Spring Boot REST API。我的问题是,我已经将Spring Security配置为允许不受限制地访问用于对/auth/token
进行身份验证的路径,但它仍然在不应该访问的情况下访问我的安全过滤器。我不知道我哪里错了任何忠告都是恰当的
public class JwtWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder)
throws Exception {
authenticationManagerBuilder
.userDetailsService(this.userDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public JwtAuthenticationFilter authenticationTokenFilter() throws Exception {
return new JwtAuthenticationFilter();
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/auth/token").permitAll() // do not authenticate
.anyRequest().authenticated()
// TODO: configure
.cors()
.and()
// TODO enable and configure
.csrf().disable()
// Unauthorized request handler
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// Keep application security stateless
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// JWT security filter
httpSecurity.addFilterBefore(authenticationTokenFilter(),
UsernamePasswordAuthenticationFilter.class);
// Disable page caching to prevent cached REST responses
httpSecurity.headers().cacheControl();
}
@Override
public void configure(WebSecurity webSecurity) throws Exception {
webSecurity.ignoring().antMatchers(HttpMethod.POST, "/auth/token");
}
}
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
// this runs
}
}
@RestController
public class AuthenticationController {
// Authenticate user
@RequestMapping(value = "/auth/token", method = RequestMethod.POST)
public ResponseEntity<?> createAuthenticationToken(HttpServletResponse response,
@RequestBody JwtAuthenticationRequest authenticationRequest, Device device) throws AuthenticationException {
// never gets to run
}
}
感谢@dur询问我是否在使用Spring Boot,让我找到了解决方案。
这让我开始思考Spring Boot喜欢自动地为我们创建bean,而这最终成了这里的罪魁祸首。结果显示,我的jWTauthenticationfilter
类被Spring Boot自动放入筛选器链中,但当我在安全配置中显式声明它时,它也包含在安全筛选器链中。因此,尽管我在安全配置中的忽略()
方法中排除/auth/token
是正确的,但这不足以阻止筛选在Spring Boot本身的上下文中发生。解决方案是配置一个bean,显式地防止Spring Boot添加bean
@Bean
public RegistrationBean jwtAuthFilterRegister(JwtAuthenticationFilter filter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
registrationBean.setEnabled(false);
return registrationBean;
}
问题内容: 我有一个通过JWT进行身份验证的Spring Boot REST API。我的问题是,我已将Spring Security配置为允许无限制地访问用于身份验证的路径,但是当它不应该被访问时,它仍然会击中我的安全过滤器。不知道我在哪里错了,任何建议都非常适合 安全配置 过滤器 控制器 问题答案: 感谢@dur询问我是否正在使用Spring Boot,这使我找到了解决方案。 这使我开始考虑S
我已经建立了一个完全工作的Spring Security流程,其中一些路径需要验证(通过令牌),而其他路径我希望保持开放和可访问,而不需要令牌。我遇到的问题是,当一个请求没有头而进入其中一个开放路径时,筛选器将被忽略,并生成正确的响应。但是,当头存在时,即使在忽略的路径上,请求也会通过整个安全筛选器链,而理想的过程是完全跳过筛选器链。 下面是我的配置。 此外,我还尝试使用将忽略的路径放入中,但没有
问题内容: 我正在编写一个使用Oracle JDBC驱动程序的Java程序。我已经在我的类路径中设置了它。当我在IDE中运行程序(作为jdbc作为库添加)时,程序运行正常。当我尝试部署它时,它完全忽略了classpath中的清单,并给了我一个NoClassDefFoundError。 我想使用客户端的JDBC驱动程序(已安装的JDBC驱动程序),并且不提供自己的驱动程序。我打包了来自JDevelo
是否可以忽略或跳过CSV文件中带有的第一行? 我试图读取和过滤只包含单词的第7行,但是因为过滤器一直在读取标题,它会弄乱下面的行。 我想因为它找不到芹菜,所以它就切断了下面的线?
我试图从管理各种Tomcat实例的应用程序生命周期的第三方工具的正常应用程序日志中筛选出启动(/关闭)事件。基础是(2.12.1),中使用,用于简单的追加器(下面的示例进行了大量简化,包括硬编码值): 相应的记录器如下所示: 当我启动实例时,将创建两个日志文件。但是,只有应用程序日志文件(application appender)包含条目,其中包括我感兴趣的要过滤掉的条目: 有什么想法,如何调试,
问题内容: 我正在尝试重定向我的响应,但是我被困在链接路径上。 以下命令将我带到tomcat的localhost并在此处搜索页面,但是按预期找不到任何内容。 为了解决此问题,我必须将我的根文件夹名称(来自webaps的名称)放在链接路径中,但是我认为这不是一个好主意。 为什么会这样呢?除了getRequestURL()或类似的方法,还有其他解决方法吗? 问题答案: 相对重定向URL相对于当前请求U