未经身份验证的用户的Spring Security 404页面

时间:2017-03-14 22:03:30

标签: java spring spring-boot

我正在使用Spring Boot和Thymeleaf。我在src/main/resources/templates/error/404.html

中定义了自定义404模板页面

当用户登录时,此功能正常。

但是,当他们退出时,他们没有获得任何类型的404页面,他们只是被重定向回/login

我认为我的安全配置需要改变但不确定是什么。

@Override
protected void configure(HttpSecurity http) throws Exception {

  http.authorizeRequests()
      .antMatchers("/","/register*","/resetPassword","/forgotPassword","/login","/404").permitAll()
      .antMatchers("/admin/**").hasAuthority("ADMIN").anyRequest()
      .authenticated().and().formLogin().loginPage("/login").failureUrl("/login?error")
      .defaultSuccessUrl("/dashboard").successHandler(successHandler)
      .usernameParameter("email").passwordParameter("password")
      .and().logout()
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login?logout").and()
      .exceptionHandling().accessDeniedPage("/access-denied");
}

@Override
public void configure(WebSecurity web) throws Exception {
  web.ignoring().antMatchers("/error**","/resources/**", "/static/**", "/css/**", "/js/**", "/img/**");
}

2 个答案:

答案 0 :(得分:2)

首先,我建议您在使用java配置为spring应用程序配置安全性时使用缩进。它有助于提高可读性。

注意第一个缩进(authRequest,formLogin,logout)上的所有顶级方法都会自行配置/更新HTTP对象。所有这些元素都来自org.springframework.security.config.annotation.web.builders.HttpSecurity类。

这些类的子级进一步细化了HTTP安全性配置。

http
.authorizeRequests()
  .antMatchers("/","/register*","/resetPassword","/forgotPassword","/login","/404")
  .permitAll()
  .antMatchers("/admin/**").hasAuthority("ADMIN")
  .anyRequest().authenticated() // <--------
  .and()
.formLogin()
  .loginPage("/login")
  .failureUrl("/login?error")
  .defaultSuccessUrl("/dashboard")
  .usernameParameter("email").passwordParameter("password")
  .and()
.logout()
  .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
  .logoutSuccessUrl("/login?logout")
  .and()
.exceptionHandling()
  .accessDeniedPage("/access-denied");

注意.anyRequest().authenticated()具体说明必须对任何请求进行身份验证。因此,当您尝试在您的域上转移任何丢失的URL时,它会要求您登录而不是转到404页面。

因此,如果您删除该语句,然后尝试转到丢失的网址页面,则会将您重定向到404页面。

答案 1 :(得分:0)

如果您删除 .anyRequest().Authenticated() 则您无需经过身份验证即可登录。

因此,不要尝试删除。例如,如果您访问地址“http://localhost:8080/user”,那么您将被带到授权页面。如果您尝试输入页面“http://localhost:8080/user/”,那么您将被带到用户页面。请注意,链接的区别仅在于末尾的正斜杠。当然,如果在这种情况下删除“.anyRequest().Authenticated()”,则需要向 antMatchers 添加更多参数,例如“/user”和“/user/”

因此,要小心谨慎。