0

Spring MVC を使用して小さなアプリケーションを開発しています。これは、ユーザーがさまざまなタイプのコンテンツを配置できるある種のビルボードです。security-config.xml を使用して、アプリのさまざまなロール (ユーザー、管理者、アノン) のセキュリティを正常に構成しました。投稿するにはログインする必要があります。管理者ユーザーのみが管理者パネルなどを見ることができます。

ここでの問題は、ユーザーごとにセキュリティを設定する必要があることです。つまり、コンテンツを変更するユーザーは、コンテンツを作成したユーザーです。もちろん、最も直接的なアプローチは、関数を呼び出す直前に、ログインしたユーザーとコンテンツの作成者の両方が同じかどうかを Java でチェックすることです。このようなもの:

@RequestMapping("/listing/deletecontent.html")
public String deleteUserContent(@RequestParam String contentId) {
    //Get the logged user
    UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    User user = userService.loadUserByUsername(userDetails.getUsername());

    //Check if the user logged and the content owner are the same
    if (user == the_user_that_created_the_content)
          listingService.deleteContent(Integer.valueOf(contentId));

    return "redirect:/listing/usercontent.html";
}

理由はわかりませんが、このアプローチは好きではありません。同じ検証を必要な場所に何度も「コピー&ペースト」するだけで、気分が良くありません。おそらく、Spring には security-config.xml で設定できる何らかのタイプの機能があり、クラスを呼び出してcontentIdパラメータを使用してすべての URL に対してこの検証を行い、それを「実際の」URL にリダイレクトする可能性があると考えていました。それはテストに合格します。わかりません、それがあなたに聞きたいことです。このアプローチについてどう思いますか? たぶん、私はうるさすぎて、そんなに悪くないのでは?それを行うための「より良い」方法を知っていますか?

どうもありがとう、ハイメ

4

1 に答える 1

0

Spring Security リファレンスの式ベースのアクセス制御の章をよく見ることをお勧めします。したがって、私が理解している限り、アクセス許可を自分で確認するのではなく、@PreAuthorize注釈を使用してください。ACL モジュールを試すか、要件を満たしていない場合は、おそらく custom を実装する方が適切PermissionEvaluatorです。

PSまた、次のようなものはどうですか: @PreAuthorize("principal.id == #content.createdBy.id")

于 2012-08-01T20:26:29.300 に答える