2

Spring Security と MVC フレームワークのコツをつかむためだけに、簡単なフォーラムを作ろうとしています。

簡単にするために、次のようなフォーラム投稿を表示するための JSP を用意してみましょう。

<body>
    ...

    Title: ${forumPost.title} <br>
    Author: ${forumPost.author.name} <br>
    Message: {forumPost.message} <br>

    <security:authorize ifAnyGranted="ROLE_ADMIN">
        Edit: <a href="/edit">Edit</a>
    </security:authorize>

    ...
</body>

私の問題は、管理者がこの投稿を編集できるだけでなく、元の作成者も編集できる必要があることです。したがって、ROLE_ADMIN と元の作成者だけが [編集] リンクを表示できるようにしたいと考えています。ただし、 security:authorizeタグを使用してユーザーごとにフィルタリングする方法、またはこれを別の方法で行う必要があるかどうかはわかりません。

どんな提案でも大歓迎です。ありがとう!

4

4 に答える 4

3

このページの背後にコントローラーがあると仮定すると、次のようなcanEditPostフィールドを に追加するだけです (半疑似コード):ModelAndView

private boolean isAdmin() {
    Authentication currentAuthObj = SecurityContextHolder.getContext().getAuthentication();
    List<GrantedAuthority> authorities = Arrays.asList(currentAuthObj.getAuthorites());
    for (GrantedAuthority auth : authorities) {
        if ("ROLE_ADMIN".equals(auth.getAuthority())) {
            return true;
        }
    }
    return false;
}

boolean currentUserIsAuthor = ...;

modelAndView.addObject("canEditPost", 
    Boolean.valueOf(currentUserIsAuthor || isAdmin());

そして、ビューで $canEditPost を参照するだけです。

ビュー/テンプレートが実際のロジックを実行するよりも、ビューがモデル内の単純なフラグを参照するだけの方が一般的には優れています。

于 2009-06-01T17:43:10.620 に答える
0

@matt bの答えはそれを行うのに最適な方法であり、おそらく私がやることになるでしょう。しかし、もう少し複雑ですが、この投稿に記載したことを達成する別の方法を見つけました。

少し読んだところ、ドメインオブジェクトレベルでセキュリティを処理でき、基本的に役割または任意のオブジェクト (現在のユーザー ID など) に読み取り/書き込み/削除権限を付与できることがわかりました。この例では、現在のユーザー ID にドメイン オブジェクトへのアクセス権を付与します。この場合は、データベースからの独自の一意の ID を持つ ForumPost オブジェクトです。

次に、現在のユーザー ID に読み取りおよび書き込みアクセスが許可され、(XML 構成を介して) ある種のカスタム ロールとして定義できます (正しい用語は実際には Voter であると思います)。次に、この有権者にMESSAGE__EDITという名前を付けることができます。

したがって、私の JSP では、次を使用できます。

セキュリティ: ifAnyGranted="MESSAGE_EDIT" を承認する

そして、(ここでも XML 構成を介して) 現在のユーザー ID を取得し、現在のドメイン オブジェクト (この場合は ForumPost オブジェクト) に基づいてアクセス権を付与します。

思ったよりもかなりの作業ですが、確実に実行できます。

このすべてに関するいくつかのドキュメントは、Spring Security Reference Documentation ( http://static.springframework.org/spring-security/site/reference/html/springsecurity.html (何らかの理由でリンクDomain オブジェクトの Security セクションは今のところ壊れています))。

于 2009-06-01T18:15:14.780 に答える
0

オブジェクトは、各作成者が一意になるようにAuthor実装されていますか?equals

その場合Authorは、現在のユーザーと同じかどうかを簡単に確認できます (タグのセットが 2 つあります)。

于 2009-06-01T17:14:34.760 に答える
0

あなたは条件を持つことができます

<% if(mycondition.isTrue()){ %>
<security:authorize ifAnyGranted="ROLE_ADMIN">
    Edit: <a href="/edit">Edit</a>
</security:author
<% }%>
于 2009-06-01T18:18:55.897 に答える