HttpSecurity、WebSecurity、AuthenticationManagerBuilder


回答:


125

configure(AuthenticationManagerBuilder)は、AuthenticationProvidersを簡単に追加できるようにすることで、認証メカニズムを確立するために使用されます。たとえば、以下は、組み込みの「user」および「admin」ログインによるメモリ内認証を定義します。

public void configure(AuthenticationManagerBuilder auth) {
    auth
        .inMemoryAuthentication()
        .withUser("user")
        .password("password")
        .roles("USER")
    .and()
        .withUser("admin")
        .password("password")
        .roles("ADMIN","USER");
}

configure(HttpSecurity)は、選択の一致に基づいて、リソースレベルでのWebベースのセキュリティの構成を許可します。たとえば、以下の例では、/ admin /で始まるURLをADMINロールを持つユーザーに制限し、他のURLは認証に成功しました。

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
}

configure(WebSecurity)は、グローバルセキュリティに影響を与える構成設定に使用されます(リソースを無視、デバッグモードを設定、カスタムファイアウォール定義を実装して要求を拒否)。たとえば、次のメソッドでは、認証のために/ resources /で始まるすべての要求が無視されます。

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

詳細については、次のリンクを参照してください。SpringSecurity Java Config Preview:Web Security


2
いい答えニック。spring-security-config-5.0.3(spring-boot 2.0.0に付属)では、メソッドを見つけることができませんでしたhttp.authorizeUrls()。おそらくhttp.authorizeRequests()少し前に名前が変更された可能性があります。
Yi Ou

5
これは古いことはわかっていますが、ここでのベストプラクティスは何ですか?configure(HttpSecurity http)メソッドの実装例であるhttp.antMatchers( "/ foo")。permitAll() "を呼び出して、configure(WebSecurityでweb.ignoring()。antMatchers(" / foo ")を呼び出すのと同じように見える例を見つけましたweb)メソッド
。– chrisinmtown

素晴らしい答え。HttpSecurityでpermitAllを呼び出す必要があるかどうか疑問に思っていますか?WebSecurityを使用して/ registerや/ loginのような開いているURLをすべて無視することはできませんか?それでは、なぜすべてのチュートリアルまたは回答が/ registerおよび/ loginに対してHttpSecurity.permitAllを使用し、/ resources of / resourcesに対してWebSecurity.ingoreを使用するのですか?–
Mohd Waseem

3

WebSecurity ignoring()メソッドの一般的な使用はSpring Securityを省略します、Spring Securityの機能はすべて利用できなくなります。WebSecurityはHttpSecurityに基づいています。

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

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/publics/**").hasRole("USER") // no effect
        .anyRequest().authenticated();
}

上記の例のWebSecurityは、Springにとを無視さ/resources/**/publics/**ます。したがって、.antMatchers("/publics/**").hasRole("USER")HttpSecurityの考慮さ

これにより、セキュリティフィルターチェーンから要求パターンが完全に省略されます。このパスに一致するものには、認証または承認サービスが適用されず、自由にアクセスできることに注意してください。

configure(HttpSecurity) でWebベースのセキュリティを設定できます 選択の一致に基づいてリソースレベル。たとえば、以下の例/admin/は、ADMINロールを持つユーザーに始まるURLを制限し、他のすべてのURLを正常に認証。

configure(WebSecurity) 構成設定に使用されます グローバルセキュリティに影響(リソースを無視、デバッグモードを設定、カスタムファイアウォール定義を実装して要求を拒否)。たとえば、次の方法では、で始まるすべての要求が認証の目的/resources/無視されます。

AuthenticationManagerBuilder
extends AbstractConfiguredSecurityBuilder<AuthenticationManager,AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder>

SecurityBuilderは、AuthenticationManagerメモリ内認証、LDAP認証、JDBCベースの認証、UserDetailsS​​erviceの追加、AuthenticationProviderの追加を簡単に行うことができます

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }

素晴らしい答え。HttpSecurityでpermitAllを呼び出す必要があるかどうか疑問に思っていますか?WebSecurityを使用して/ registerや/ loginのような開いているURLをすべて無視することはできませんか?それでは、なぜすべてのチュートリアルまたは回答が/ registerおよび/ loginに対してHttpSecurity.permitAllを使用し、/ resources of / resourcesに対してWebSecurity.ingoreを使用するのですか?
Mohd Waseem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.