web-dev-qa-db-ja.com

Spring Security / j_spring_security_checkが見つかりません404

これが私のWebAppInitializerです。

@Configuration
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

これが私のセキュリティ設定です:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
                .antMatchers("/signup", "/about").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and().formLogin().loginPage("/login").defaultSuccessUrl("/home").failureUrl("/error").permitAll()
                .and().httpBasic();
        // @formatter:on
    }

}

そしてこれは私のlogin.html(thymeleafのhtmlの例)です:

<form th:action="@{/j_spring_security_check}" method="post">
  <label for="j_username">Username</label>:
  <input type="text" id="j_username" name="j_username" /> <br />

  <label for="j_password">Password</label>:
  <input type="password" id="j_password" name="j_password" /> <br />

  <input type="submit" value="Log in" />
</form>

ログインをクリックすると、次のエラーが表示されます。

HTTP ERROR 404

Problem accessing /j_spring_security_check. Reason:

    Not Found

このエラーを取り除くにはどうすればよいですか?私はたくさんグーグルで検索しましたが、まだ成功していません。 (はい、xmlは使用しません。)

9
akcasoy

私はこれを作成しました、そしてそれは今働きます:

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}

これにより、SpringSecurityFilterChainが適切にアクティブ化されます。

また、CSRFエラーのため、@ EnableWebSecurityから@ EnableWebMvcSecurityに切り替える必要がありました。春のドキュメントのように書かれています:

...その理由は、Spring SecurityがCSRF攻撃から保護しており、リクエストにCSRFトークンが含まれていないためです。 @EnableWebMvcSecurityアノテーションを使用するように構成を更新します。これは、@ EnableWebMvcSecurityと同じように機能し、SpringMVCとの統合を提供します。特に、Thymleaf2.1 +またはSpringMVC taglibsを使用すると、CSRFトークンがフォームに自動的に含まれるようになります...

また、M。Deinumのコメントに感謝します。 Springは最近、/ j_spring_security_check/j_password/j_usernameを/ login/password/usernameに切り替えたようです。

9
akcasoy

Spring 4.Xを使用している場合は、バージョンの問題になる可能性があります。

a。)ログインURL = /ログインb。)ログアウトURL =/logout

スプリング3.Xの場合のように

a。)ログインURL =/j_spring_security_check b。)ログアウトURL =/j_spring_security_logout

19
Tanuj Verma

Csrfを無効にすると、この問題にも直面しました。 loginProcessingUrlを明示的に指定しようとしましたが、完全に機能しました。

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
   httpSecurity.csrf().disable();
   httpSecurity.formLogin().loginProcessingUrl("/login-url");
}

次の点に注意してください。

  1. このURLでは、HTTP POSTメソッドのみが許可されます。
  2. Spring Securityのその他のデフォルトの重要なURLは次のとおりです。1。/login:デフォルトのログインフォームを返します2. /logout

私のSpring Securityバージョンは4.0.3.RELEASEです

P/S:私の答えは質問に直接関係していないかもしれませんが、私のようなSpring Securityに不慣れな人を助けることができると思います

3
Tho