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