web-dev-qa-db-ja.com

Spring Securityを使用して、HTTPメソッド(GET、PUT、POSTなど)を使用して特定のURLパターンのセキュリティを区別するにはどうすればよいですか?

SpringSecurityリファレンスには次のように記載されています。

複数の要素を使用して、URLのセットごとに異なるアクセス要件を定義できますが、それらはリストされた順序で評価され、最初の一致が使用されます。したがって、最も具体的な一致を一番上に配置する必要があります。メソッド属性を追加して、特定のHTTPメソッド(GET、POST、PUTなど)への一致を制限することもできます。リクエストが複数のパターンに一致する場合、順序に関係なく、メソッド固有の一致が優先されます。

特定のURLパターンへのアクセスがURLパターンへのアクセスに使用されるHTTPメソッドに応じて異なる方法で保護されるようにSpringSecurityを構成するにはどうすればよいですか?

15
kamaci

これは構成についてのみです。 <intercept-url>要素は、構成ファイルの<http />タグで上から下に評価されると書かれています。

<http auto-config="true">
    <intercept-url pattern="/**" access="isAuthenticated" />
    <intercept-url pattern="/login.jsp" access="permitAll" />
</http>

上記の例では、認証されたユーザーのみに、もちろんログインページを除くすべてのアクセスを許可しようとしています(ユーザーは最初にログインする必要がありますよね?!)。しかし、これは、ドキュメントによると、機能しません、あまり具体的でない一致が上にあるためです。したがって、この例の目的を達成するための適切な構成(の1つ)は次のとおりです。

<http auto-config="true">
    <intercept-url pattern="/login.jsp" access="permitAll" />
    <intercept-url pattern="/**" access="isAuthenticated" />
</http>

より具体的な一致を上に配置します。

引用が最後に言っているのは、HTTPメソッドについてです。これを使用して一致を指定できるため、次のようになります。

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

この2番目の例では、GETを介して/client/editにアクセスするには、ユーザーを認証するだけで済みますが、POST(たとえば、編集フォームを送信する)を介して/client/editにアクセスするには)ユーザーはEDITORロールを持っている必要があります。そのURLパターンは、場所によっては推奨されない場合がありますが、これは単なる例です。

27
bluefoot

Javaアノテーションベースの構成を好む場合は、このクラスをアプリケーションにドロップしてください。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers(HttpMethod.GET).permitAll();
        http.authorizeRequests().antMatchers(HttpMethod.POST).denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.DELETE,"/you/can/alsoSpecifyAPath").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PATCH,"/path/is/Case/Insensitive").denyAll();
        http.authorizeRequests().antMatchers(HttpMethod.PUT,"/and/can/haveWildcards/*").denyAll();

    }

}

次のMaven依存関係を使用します(以前のバージョンのSpring-Securityも機能するはずです)。

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.0.0.M3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.0.0.M3</version>
    </dependency>
15
mancini0