0

私は、spring-boot + spring-mvc + spring-securityプロジェクトをセットアップしました。無効なURLをログインページにリダイレクトするためのスプリングセキュリティの防止

無効なURLを除いて、現在すべてが正常に動作します。私が発行した場合

​​

私は404ページが見つかりませんを見ることを期待しますが、春・セキュリティは、最初のログインページにリダイレクトし、認証後に404が見つからない示しています!

私はこれがうまくいくとは思わない!ここで

は私のWebSecurity社の設定は次のとおりです。

package com.webitalkie.webapp.config; 

import java.util.EnumSet; 

import javax.servlet.DispatcherType; 
import javax.servlet.ServletContext; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.crypto.password.PasswordEncoder; 
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; 

import com.webitalkie.webapp.security.DatabaseUserDetailsServic; 

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DatabaseUserDetailsServic userDetailsService; 
    @Autowired 
    private ServletContext servletContext; 

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

     servletContext.getFilterRegistration(AbstractSecurityWebApplicationInitializer 
       .DEFAULT_FILTER_NAME).addMappingForUrlPatterns(EnumSet 
         .allOf(DispatcherType.class), false, "/*"); 

     http.csrf().disable(); 
     http.authorizeRequests() 
     .antMatchers("/home/", "/home", "/home/index", "/", "/favicon.ico").permitAll() 
     .antMatchers("/contents/**").permitAll() 
     .anyRequest().authenticated() 
     .and() 
     .formLogin() 
     .loginPage("/home/loginsec").failureUrl("/loginsecerror").permitAll() 
     .and() 
     .logout() 
     .logoutUrl("/home/logout") 
     .logoutSuccessUrl("/home/index") 
     .invalidateHttpSession(true); 

    } 

    @Override 
    @org.springframework.beans.factory.annotation.Autowired 
    protected void configure(
      org.springframework.security.config.annotation 
      .authentication.builders.AuthenticationManagerBuilder auth) throws Exception { 

     auth.userDetailsService(userDetailsService).passwordEncoder(getPasswordEncoder()); 
    } 

    public PasswordEncoder getPasswordEncoder() { 

     return new BcryptPasswordEncoder(11); 
    } 
} 

君たちは、任意のアイデアを持っていますか?

答えて

1

特定のユースケースをカスタマイズするには、提案したように反転論理を適用します。あなたはこのように行うことができます。)

.anyRequest().anonymous() 

2で

.anyRequest().authenticated() 

を交換してください)2に

.antMatchers("/protected-urls/**").authenticated() 

にルールを追加します)1で、その前に来なければなりません)最初の試合が適用されるため。保護されたリソースの共通の接頭辞がない限り、すべての認証済みURLを1つずつ宣言する必要があります。

また、静的リソースを無視する例えば

public void configure(WebSecurity web)... 

をオーバーライドし、追加の構成を適用することができます。

web.ignoring().antMatchers("/favicon.ico", "*.css") 

お役に立てば幸いです。

+0

最後の部分は本当に助けにはならない、OPはすべての既存のURLをリストすることはできません。認証済みのユーザは404の代わりに403を受け取るべきではないので、 '.anyRequest()。anonymous()'の代わりに '.anyRequest()。permitAll()'を使用します。 – dur

+0

ありがとう@willerr、実際に私はセキュリティの前に無効なパスをチェックするソリューションですが、これは実際に私のユースケースを解決します。ありがとうございました – madz

0

これはセキュリティ機能ですが、問題はありません。

セキュリティモデルは、「明示的に許可されていない限り、すべて拒否」です。要求パスが保護されている(つまり、permitAllパスに明示的に一致しない)場合、ユーザーが認証されるまで存在しないことを明らかにする必要はありません。特定の状況で404が個人情報を漏洩する可能性があります

.../user/jonesは404ですか?うーん...ジョーンズに何かが起こった

これは、うまく設計されたログインフォームでは、「ユーザーが見つかりません」または「無効なパスワード」とは言わず、代わりにすべての不具合あまりにも多くを与えることを避けるために。

セキュリティをバイパスするために無効なURLを取得する唯一の方法は、明示的に保護されていない限り、すべてを公開することです(明示的に禁止されていない限り許可します)。新しいルートパスが作成されるたびに定義を更新することを覚えておく必要があるなど、独自の問題があります。

+0

お返事ありがとうございます。まあ、それはもう少し保護することができますが、私はほとんどの状況でそれが必要ではないと言うでしょう。さらに、今日のウェブは単にセキュリティだけではなく、そのUI +セキュリティ+ SEOなどです。すべての要件のバランスをとる必要があります。たとえば、gmail.com/xyzにヒットしたらどうなりますか? 404お探しのページが見つかりませんでした。私の経験では、URLが有効でない場合は404で応答する方が良い – madz

+0

また、すべてのユーザーが無効なURLのログインにリダイレクトするのを避ける必要があるとは言いませんが、私は特定の用途のカスタマイズを探しています。 – madz

関連する問題