こんにちはすべて私は初心者のgrails/springセキュリティの質問があります。 grails 3プロジェクトではspring-security-oauth2-providerを使ってoauth2を設定しました.REST APIを保護するためにはうまくいくようです。grailsと既存のoauth2プロバイダで春のセキュリティを使用してフォームベースのログインを実装する方法
しかし、私たちはGSPを使って同じプロジェクトにWebフロントエンドを追加し始め、交差点に着きました。通常、oauth2は、エンドポイントへの認証とトークンの受信によって動作します。トークンは、保護されたリソースへのアクセスを維持するための後続の要求でHTTPヘッダーで使用できます。しかし、私のWebフロントエンドにはログインページがあります。だから当初は、Webフロントエンドをクライアントの1つとして扱うことにしました(私たちのiOSアプリには1クライアント、Androidアプリには1クライアントがあります。しかし、同じプロジェクト内にあるので、私たちのoauth2プロバイダーのエンドポイントに私たちのコントローラーコードから(ログイン用の)HTTP要求をするのは奇妙に思えます。私のWebフロントエンドが必要とするほとんどのリクエストは、基本的なサービスとドメインオブジェクトに直接アクセスしたいので、特別なホップを追加することは非生産的です。
コントローラのコードでlogin.gspを使用してログインすると、私はoauth2のログインを迂回して、私が使用しているUsernamePasswordAuthenticationTokenでauthenticationManager.authenticate()を使用してストレートスプリングのセキュリティ認証を行います。私のフォームに渡されたユーザー名とパスワードフィールドから構成し、次にレスポンスに対してSecurityContextHolder.getContext()。setAuthentication()を呼び出します。このような半分の問題は、this投稿から現状のスレッドでSecurityContextHolderを設定するだけで、フィルタチェーンの終わりでSecurityContextHolderがクリアされるので、後続のリクエストは認証されないという問題が解決されます。この認証が成功した場合(すなわち例外がスローされない場合)は、ユーザーオブジェクトをHTTPセッションに挿入し、その後のすべてのリクエストで、認証済みであることを「通知」する方法で取得しようとします。しかし、これはハッキーと汚れているようです。それは私のユーザオブジェクトがDBセッションに接続されていないことにつながります(遅延初期化の例外を引き起こします)。
thisのように、SecurityContext全体がHTTPセッションに置かれているが、後続の要求でそのSecurityContextを使用する方法を示していないような投稿から、同様の提案がありました。
私の究極の質問は、間違った方向に進むのでしょうか?私がしたいことを達成するためのより良い、よりクリーンな方法がありますか?私たちがこれをやろうとする最初の人になることはできないと思います。
を私は「shouldnもはや私自身の質問に再び答えていることに驚くことはありません。おそらくそれは答えがあまりにも明白だったか、あるいは誰もこれに遭遇しなかったかもしれないからです。いずれにせよ、私はちょうど誰かがこの有用性を見つけた場合に備えて、ここに私の旅を「ブログ」するつもりです。 私の質問に対する短い答えは、全くありません。それは絶対に不要です。 Spring Securityには多くのデフォルト/組み込み機能が用意されています。 コメントは最大600文字ですので、私は別の答えの形で私の付録を投稿しますが、私が与えられたすべてのスペースを使い果たす前に投稿します。 – paulito415