web-dev-qa-db-ja.com

Spring SecurityにおけるpermitAll()とanonymous()の違いを理解する

これが正しく取得されたかどうかを確認したいだけなので、どんな応答にも感謝します。私の構成オーバーライドで:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http.
        [...]
        permitAll()
        [...]
}

permitAll()はすべてのリクエストを許可しますが、

anonymous()

notログインしているユーザーのみにアクセスを許可しますbutどちらの場合もHttpSession-オブジェクトはデフォルトで作成されます。

そうですか?

11
Wolfone

春から ドキュメント

許可するものを明示的に指定し、それ以外のものはすべて許可しない「デフォルトで拒否」を採用することは、一般に優れたセキュリティプラクティスと見なされています。認証されていないユーザーがアクセスできるものを定義することは、特にWebアプリケーションの場合、同様の状況です。多くのサイトでは、ユーザーが少数のURL以外のもの(ホームページやログインページなど)に対して認証される必要があります。この場合、保護されたすべてのリソースに対してではなく、これらの特定のURLに対してアクセス構成属性を定義するのが最も簡単です。別の言い方をすると、ROLE_SOMETHINGがデフォルトで必要であり、アプリケーションのログイン、ログアウト、ホームページなど、このルールに対する特定の例外のみを許可するのが良い場合があります。これらのページをフィルターチェーンから完全に省略して、アクセス制御チェックをバイパスすることもできますが、他の理由、特にページが認証されたユーザーに対して異なる動作をする場合、これは望ましくない場合があります。

これが、匿名認証の意味です。

そして

「匿名で認証された」ユーザーと認証されていないユーザーとの間には、概念的な違いはありません。 Spring Securityの匿名認証は、アクセス制御属性を構成するためのより便利な方法を提供します。

.permitAll()を使用すると、すべてのリクエスト(匿名ユーザーとログインユーザーの両方)がその特定のパスで許可されるように認証が構成されます。

.anonymous()式は、主にユーザーのステータス(ログインしているかどうか)を参照します。基本的に、ユーザーが「認証」されるまでは「匿名ユーザー」です。それは誰にとっても「デフォルトの役割」を持っているようなものです。