web-dev-qa-db-ja.com

Spring Security Java構成がログアウトURLを生成しない

Spring 4.0.5.RELEASEとSpring Security .2.4を使用しています。

Java config(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();
    }
}

これが私のWebAppInitializerto bootstrap the app

 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[] {"/"};
    }
}

そして最後に私の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;
    }
}
11
Ayub Malik

デフォルトでは、ログアウトURLにPOSTリクエストが必要です。GETリクエストでログアウトを実行するには、次のものが必要です。

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));

または、PUTまたは他のメソッドをサポートする場合は、これをパラメーターとして渡します。

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "PUT"));

ドキュメントを参照してください: http://docs.spring.io/spring-security/site/docs/3.2.4.RELEASE/reference/htmlsingle/ (セクション6.5.3。ログアウト)

42
Evgeni Dimitrov