SpringSecurityリファレンスには次のように記載されています。
複数の要素を使用して、URLのセットごとに異なるアクセス要件を定義できますが、それらはリストされた順序で評価され、最初の一致が使用されます。したがって、最も具体的な一致を一番上に配置する必要があります。メソッド属性を追加して、特定のHTTPメソッド(GET、POST、PUTなど)への一致を制限することもできます。リクエストが複数のパターンに一致する場合、順序に関係なく、メソッド固有の一致が優先されます。
特定のURLパターンへのアクセスがURLパターンへのアクセスに使用されるHTTPメソッドに応じて異なる方法で保護されるようにSpringSecurityを構成するにはどうすればよいですか?
これは構成についてのみです。 <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パターンは、場所によっては推奨されない場合がありますが、これは単なる例です。
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>