春のセキュリティにおけるURLパターンとは少し混乱しています。サーブレットコアhttpセキュリティでは、/
および/*
urlパターンが1つ以上のディレクトリの指定に使用されるためです。 /
は1つのディレクトリに使用され、/*
は多くのディレクトリに使用されます。ただし、春のセキュリティでは、/**
も導入されています。これは、セキュリティにおける/**
url-patternの主な目的です。
/ *と/ **の違いは、2番目はサブディレクトリを含むディレクトリツリー全体と一致することです。
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
.antMatchers(HttpMethod.GET, "/**").permitAll
.antMatchers(HttpMethod.POST, "/*").permitAll
// ...
}
この構成では、「Get」要求はすべて許可されます。次に例を示します。
したがって、このすべてのURLは、パターン "/ **"のテキストと一致します。
"Post"に許可されたURL:
上記のURLは「/ *」と一致します
Spring Securityのドキュメントによると、/**
の主な目的は、すべてのワイルドカードをキャッチすることです。
実際には、アプリケーションへのアクセスを制御するためにサービスレイヤーでメソッドセキュリティを使用し、Webアプリケーションレベルで定義されたセキュリティ制約の使用に完全に依存しないことをお勧めします。 URLは変化するため、アプリケーションがサポートする可能性のあるすべてのURLと、リクエストの操作方法を考慮することは困難です。理解しやすいいくつかの単純なantパスの使用に制限してください。キャッチオールワイルドカード(/ **または**)を最後に定義してアクセスを拒否する場合は、常に「デフォルトで拒否」の方法を使用するようにしてください。
それも忘れてはならない
パターンは常に、定義された順序で評価されます。したがって、特定性の低いパターンよりも特定性の高いパターンをリストの上位に定義することが重要です。
したがって、次のようになります。
<security:http pattern="/rest-service/**" authentication-manager-ref="authenticationManager" auto-config="false" access-decision-manager-ref="accessDecisionManager">
<security:intercept-url pattern="/rest-service/report/export/xml" access="AUTH_REPORT_EXPORTXML" />
<security:intercept-url pattern="/**" access="AUTH_SYSTEM_LOGIN" />
<security:http-basic />
</security:http>
つまり、すべてのリクエストに対してAUTH_SYSTEM_LOGIN権限が必要になりますが、特に/ rest-service/report/export/xmlの場合、ユーザーは上記で定義されているため、AUTH_REPORT_EXPORTXML権限も必要になります。彼らが言うように、このセキュリティ制約だけに頼るのではなく、次のようなセキュリティで保護されたアノテーションを使用して、サービスメソッドでそれらを複製することも良いことを意味します。
@Secured("AUTH_REPORT_EXPORTXML")
一般的に私が理解しているように、最後のワイルドカードがすべてのワイルドカードをキャッチすることを除いて、/*
と/**
の間に違いはありません。