管理者がユーザーを作成し、特定の種類のエンティティに役割を割り当てることができるアプリケーションがあります。
たとえば、エンティティが呼び出された場合Student、アプリケーションのユーザーは次のようなさまざまなレベルの特権を持ちます。
- VIEWER-生徒の詳細を表示
- EDITOR-生徒の詳細を編集する
- EXPORTER-学生の詳細をエクスポートする
上記のアクションを実行するためのURIは次のようになります。
GET-/content/{classId}/{studentId}/viewPUT-/content/{classId}/{studentId}GET-/content/{classId}/{studentId}/exportPOST-/content/{classId}/{studentId}/export
URIは動的な性質のものであることに注意してください。また、特定のユーザーにとの役割をUser A割り当てることができます。VIEWERClass 1EXPORTERClass 2
私のスプリングセキュリティ構成では、2つの権限のみが定義されています-ADMINISTRATORとUSER。
ADMINISTRATOR-すべてにアクセスできますUSER-URI以外のすべてにアクセスできます/admin/*。
ロール、、VIEWERはEDITOR、EXPORTERスプリングセキュリティロールではありません。ユーザーが権限を持たないリソースにアクセスすることを制限しているときに、問題が発生しました。
また、ユーザーに権限がない場合は、[エクスポート]ボタン(アプリケーションのどこかに配置されている)EXPORTERも表示されないはずです。おそらく、私は春のtaglibを使用してこれを行うことができます。しかし、それはまったく別の問題です。security
スプリングセキュリティを認識させることはできますが、問題は、読み取りのロジック{studentId}(@PathVariable)をどこに配置し、現在ログインしているユーザーと照合して、アクセスできるかどうかを確認することです。
HandlerInterceptorをリッスンするフィルター/を作成するというアイデアも考えました/content/*。ただし、URIを解析し、2番目のパスパラメータを自分で抽出して、データベースと照合するなど、醜いことをする必要があります。
これを行うためのよりエレガントで春のセキュリティの方法はありますか?
どんな考えでも歓迎します。