7

Spring Securityを使用して、ユーザー、グループ、および権限を管理したいと思います。

ACLを使用してドメインオブジェクトを保護したいのですが、グループをACLに割り当てる方法が見つかりません。

例:ユーザーとグループがあります。各グループは、次のセキュリティを持つことができます。-フォーラムを管理する(のような役割にすることができますROLE_FORUM_MANAGER)-特定のフォーラムを編集します(特定のフォーラムのacl)。

さらに、グループはロールを持つユーザーによって定義されますROLE_PERMISSION_MANAGER。ただし、このユーザーによって定義されたすべてのグループは、このユーザーのみが編集および管理できます。したがって、グループはユーザーに関連付けられます。正確には、ユーザーがGoogleグループを作成するとします。このユーザーは、自分が作成したグループに対してのみ適切な権限グループを管理できます。そして、彼は独自のグーグルグループの特定のフォーラムを管理するためのグループを作成することができます。

どうすればいいですか?

私は春のセキュリティドキュメントと次のチュートリアルを読みました(したがって、これらのリンクに私を送らないでください):http: //grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

4

3 に答える 3

16

SpringSecurity3.0を確認してください。SpringExpressionLanguageを使用することでACLの使用を完全に回避できる可能性があります。

たとえば、フォーラムを編集するには、次のようにセキュリティで保護されたメソッドがあります。

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update'))
public void updateForum(Forum forum) {
    //some implementation
}

次に、次のようなカスタム権限エバリュエーターにhasPermissionメソッドを実装します。

public class ForumPermissionEvaluator implements PermissionEvaluator {

    public boolean hasPermission(Authentication authentication,
            Object domainObject, Object permission) {
        //implement
    }

    public boolean hasPermission(Authentication authentication, 
            Serializable targetId, String targetType, Object permission) {
        //implement
    }
}

最後に、アプリケーション構成で相互に接続します。

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

<beans:bean id="permissionEvaluator"
    class="x.y.z.ForumPermissionEvaluator" />
于 2009-12-20T12:06:58.577 に答える
2

私はあなたのグループを役割のように使うでしょう。Spring ACLの実装はかなり扱いにくく、ほとんどの場合使用できないことがわかりました。ユーザーを「グループ」(実際にはすべてのロール)に割り当てて、通常のロールベースの承認と同じようにチェックします。

于 2009-12-18T16:10:49.130 に答える
1

私は「手動で」同様のことを行いました。つまり、特定のユーザーが編集/削除できるインスタンスを判別するための独自のコードがあり、機能にアクセスして役割/認証を提供するための適切な役割を確実に持つために、Springセキュリティのみに依存していました。現在のユーザーの情報。

そのため、コードで現在のプリンシパル(独自のUserクラス)を決定し、それに基づいて、このユーザーが特定のインスタンスに対してどのような権限を持っているかを決定しました。

public static User getCurrentUser() {
    User user = null;
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null) {
        Object principal = auth.getPrincipal();
        if (principal instanceof User) {
            user = (User)principal;
        }
    }
    return user;
}
于 2009-12-18T10:28:44.887 に答える