私はREST(Spring MVC)バックエンドと純粋なJavaScriptフロントエンドを持つSpring Bootアプリケーションを持っています。最近、春のセキュリティを使用してセキュリティを有効にしました。どのように特権を持つユーザにがあるのか、つまりについては、ロールに応じてどのようなコントロールをユーザに提示する必要があるのかを説明しています。私が試した何のためRESTアプリケーションのUIの特権エンドポイント
:
私達はちょうど公開し、エンドポイント当局(役割)のリストと、それにUIの契約を許すことができます。これはバックエンドにとっては簡単ですが、バックエンドではROLE - > Allowed URLsのマッピングを維持し、フロントエンドでも同じことが行われます。ある時点でこれらは分岐します(私は確信しています)。使用された場合、
403 - Unauthorized
というUIコントロールが表示されます。これはRESTの理由でURLを中心にしています。質問:に回答するエンドポイント(例:
/security/privileges?url=...&method=...
)を持っていますか?リクエストメソッドyでURL xにアクセスできましたか?これにより、UIはURLだけに焦点を当てることができます。あなたは@Pre/@Post
注釈を通じてメソッドレベルのセキュリティでフィルターを通してWebセキュリティを組み合わせた特別なときには(バックエンドのために不可能悪夢/のように見えます
質問:。
は、私がどのようにベストプラクティスに探していますURLを中心にするか、役割のリストを送信するだけですか?
URL中心のアプローチを行った人は、コントローラのメソを調べる方法がありますセキュリティチェックに合格するかどうかを判断するWebInvocationPrivilegeEvaluatorは、メソッドレベルのセキュリティを考慮していないため、十分ではありません。
EDIT: ロールのリストを送信するとアプローチについての私の疑問を明確にします。私が行う場合は、その:
MVCコントローラ:
@PreAuthorize("hasAnyRole('ADMIN', 'EDITOR'")
@RequestMapping("/editStuff")
public void editStuff(...) {
...
}
JS:役割EDITORまたはADMINのいずれかを有するため
if (hasRole('ADMIN') || hasRole('EDITOR')) {
showEditControllWhichOnClickCalls('/editStuff');
}
明らかに存在重複してチェック。
if (doIHaveAccessTo('/editStuff', 'POST')) {
showEditControllWhichOnClickCalls('/editStuff');
}
に答えるために、ロールのリストをみます。 URLは十分なものです。 _ "ある時点でこれらは分岐する" _ == _ "ある時点で、私のコードにはバグが含まれているでしょう"そのため、あなたは自動テストをしています。 – zeroflagL
ご意見ありがとうございます。 2つの場所で管理しなければならない複製されたコードは私にとってバグと同じではありません。私は役割のリストを送ることについての疑問を明確にします。 –
別のポイント・ビューを使うことをお勧めします。バックエンドを忘れて、それが他人によって提供されたと想像してください。どの公開APIでもそうです。どのようにあなたのクライアントアプリケーションにセキュリティを組み込むのが好きですか? Btw:クライアントアプリケーションを開発するだけの場合は、既存のロールを含めることができないということは、バグです。 URLは間違いなく十分です。あなたはメディアタイプAのための権利を読んだり書いたりする権利を持っているかもしれませんが、Bはそうではありません。それはすべてUIに影響します... – zeroflagL