[英]JWT Token not generated after successful Authentication in Spring Boot
我创建了两个过滤器来为每个请求运行 JwtUsernameAndPasswordFilter 和 JwtTokenVerifier。 我以前使用过这两个过滤器,它们已经奏效了。 我认为主要问题在于我的 Spring 安全配置。 当我调试这两个过滤器时,只有 JwtTokenVerified 被识别并且 JwtUsernameAndPasswordFilter 根本不会被调用。 当我使用 application/json 内容类型从 PostMan 发出请求时,服务器会给我一个错误:
class path resource [templates/logIn.html] cannot be opened because it does not exist
/登录 Controller
@RequestMapping(value="/logIn",method = {RequestMethod.POST,RequestMethod.GET})
public void login(){
}
Spring 安全配置
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@Configuration
@Builder
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private SecureUserDaoService secureUserDaoService;
private JwtConfig jwtConfig;
private SecretKey secretKey;
private PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(new JwtUsernameAndPasswordFilter(authenticationManager(), jwtConfig, secretKey))
.addFilterAfter(new JwtTokenVerifier(secretKey, jwtConfig), JwtUsernameAndPasswordFilter.class)
.authorizeRequests()
.antMatchers("/accountPage", "/accountSettings").authenticated()
.antMatchers("/", "/signUp", "/logIn").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.failureUrl("/")
.successForwardUrl("/accountPage");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(daoAuthenticationProvider());
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider(){
DaoAuthenticationProvider provider =
new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder);
provider.setUserDetailsService(secureUserDaoService);
return provider;
}
github 回购
更新:
通过在客户端调用“/login”而不是“/logIn”使其工作,因为显然即使我 add.loginPage("/logIn") AND.logInProcessingUrl("/logIn")。看起来 spring 仍然没有通过过滤器链时识别我的自定义登录 controller。 如果您知道更好的解决方案,请随时在下面发表评论
当我调试这两个过滤器时,只有 JwtTokenVerified 被识别并且 JwtUsernameAndPasswordFilter 根本不会被调用。
正在调用JwtUsernameAndPasswordFilter
。 为了证明这一点,要么在您的过滤器中放置一个调试语句,或者更好,在您的SecurityConfig.java
中,启用Spring Security debugger
,如下所示:
@EnableWebSecurity(debug=true)
你会看到这个:
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
JwtUsernameAndPasswordFilter // This is your filter
UsernamePasswordAuthenticationFilter
JwtTokenVerifier // This is your filter
DefaultLoginPageGeneratingFilter
DefaultLogoutPageGeneratingFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
]
当我使用 application/json 内容类型从 PostMan 发出请求时,服务器会给我一个错误:
class 路径资源 [templates/logIn.html] 无法打开,因为它不存在
这是因为在您的/templates
文件夹中,没有logIn.html
。
通过在客户端调用“/login”而不是“/logIn”使其工作,因为显然即使我 add.loginPage("/logIn") AND.logInProcessingUrl("/logIn")。看起来 spring 仍然没有通过过滤器链时识别我的自定义登录 controller。 如果您知道更好的解决方案,请随时在下面发表评论
/login
之所以有效,是因为您没有在 SecurityConfig.java、Spring 中定义自定义登录页面,因此安全性会将您重定向到其默认登录页面。
如果您不想要该功能,可以按如下方式自定义loginPage
:
.and()
.formLogin().loginPage("/customizeMe") // Your custom login page here
.failureUrl("/")
.successForwardUrl("/accountPage");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.