Spring Security Java Config不生成logout url

Ayu*_*lik 11 java configuration spring spring-security spring-java-config

我使用的是Spring 4.0.5.RELEASE和Spring Security 3.2.4.

我正在尝试使用java配置创建一个简单的示例应用程序(基于Spring示例).应用程序启动并且身份验证正常运行,也就是说,在访问受保护的url / settings/profile时,我被重定向到登录表单

但是没有/ logout url生成?如果我点击localhost:8080/logout我得到404.

我在之前的项目中使用了类似的代码,所以可能与版本有关?

继承我的安全配置

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
        auth.inMemoryAuthentication().withUser("admin").password("password").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/settings/**").hasRole("ROLE_ADMIN")
                    .and()
                .formLogin()
                    .and()
                .logout()
                    .deleteCookies("remove")
                    .invalidateHttpSession(true)
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/logout-success")
                .permitAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的WebAppInitializer来引导应用程序

 public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { SecurityConfig.class , MvcConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
         return new String[] {"/"};
    }
}
Run Code Online (Sandbox Code Playgroud)

最后是我的MvcConfig

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = {"web"})
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
Run Code Online (Sandbox Code Playgroud)

Evg*_*rov 42

默认情况下,注销URL需要POST请求.要在GET请求上执行注销,您需要:

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
Run Code Online (Sandbox Code Playgroud)

或者如果您想要支持PUT或其他方法,请将其作为参数传递:

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "PUT"));
Run Code Online (Sandbox Code Playgroud)

请参阅文档:http://docs.spring.io/spring-security/site/docs/3.2.4.RELEASE/reference/htmlsingle/(第6.5.3节.注销)

  • 不管怎样,你知道如何用xml配置吗? (4认同)
  • 值得注意的是,这不是最佳实践,因为它可以让您了解潜在的CSRF攻击.来自JavaDoc:`触发注销的URL(默认为"/ logout").如果启用了CSRF保护(默认),则该请求也必须是POST.这意味着默认情况下需要POST"/ logout"来触发注销.如果禁用CSRF保护,则允许任何HTTP方法.在任何更改状态(即注销)的操作上使用HTTP POST以防止CSRF攻击被认为是最佳做法....` (2认同)