4

管理者がユーザーを作成し、特定の種類のエンティティに役割を割り当てることができるアプリケーションがあります。

たとえば、エンティティが呼び出された場合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割り当てることができます。VIEWERClass 1EXPORTERClass 2

私のスプリングセキュリティ構成では、2つの権限のみが定義されています-ADMINISTRATORUSER

  • ADMINISTRATOR-すべてにアクセスできます
  • USER-URI以外のすべてにアクセスできます/admin/*

ロール、、VIEWEREDITOREXPORTERスプリングセキュリティロールではありません。ユーザーが権限を持たないリソースにアクセスすることを制限しているときに、問題が発生しました。

また、ユーザーに権限がない場合は、[エクスポート]ボタン(アプリケーションのどこかに配置されている)EXPORTERも表示されないはずです。おそらく、私は春のtaglibを使用してこれを行うことができます。しかし、それはまったく別の問題です。security

スプリングセキュリティを認識させることはできますが、問題は、読み取りのロジック{studentId}@PathVariable)をどこに配置し、現在ログインしているユーザーと照合して、アクセスできるかどうかを確認することです。

HandlerInterceptorをリッスンするフィルター/を作成するというアイデアも考えました/content/*。ただし、URIを解析し、2番目のパスパラメータを自分で抽出して、データベースと照合するなど、醜いことをする必要があります。

これを行うためのよりエレガントで春のセキュリティの方法はありますか?

どんな考えでも歓迎します。

4

1 に答える 1

3

春のセキュリティを独自の実装で提供できますSecurityExpressionHandler。を拡張DefaultWebSecurityExpressionHandlerしてオーバーライドするだけcreateSecurityExpressionRootです。デフォルトでは、このメソッドは のインスタンスを返しますWebSecurityExpressionRoot。実装では、このクラスを拡張して追加のメソッドを追加するだけで、Spring セキュリティ構成で使用できます。

ここでは、SecurityExpressionHandler の独自の実装を提供する方法を示します。コードは、春のセキュリティ ドキュメントからのものです。

<security:global-method-security pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler"/>
</security:global-method-security>

<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <property name="permissionEvaluator" ref="myPermissionEvaluator"/>
</bean>

回答は十分な情報を提供していますか、それともさらに支援が必要ですか?

于 2012-12-07T16:27:50.190 に答える