これが私の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は使用しません。)
私はこれを作成しました、そしてそれは今働きます:
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に切り替えたようです。
Spring 4.Xを使用している場合は、バージョンの問題になる可能性があります。
a。)ログインURL = /ログインb。)ログアウトURL =/logout
スプリング3.Xの場合のように
a。)ログインURL =/j_spring_security_check b。)ログアウトURL =/j_spring_security_logout
Csrfを無効にすると、この問題にも直面しました。 loginProcessingUrl
を明示的に指定しようとしましたが、完全に機能しました。
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable();
httpSecurity.formLogin().loginProcessingUrl("/login-url");
}
次の点に注意してください。
HTTP POST
メソッドのみが許可されます。Spring Security
のその他のデフォルトの重要なURLは次のとおりです。1。/login
:デフォルトのログインフォームを返します2. /logout
私のSpring Security
バージョンは4.0.3.RELEASEです
P/S
:私の答えは質問に直接関係していないかもしれませんが、私のようなSpring Security
に不慣れな人を助けることができると思います