2

このクラスを考えてみましょう (groovy で):

class Class_A {
    String type
    ...
}

タイプの値に基づいて、そのインスタンスへのアクセス レベルを定義したいと考えています。たとえば、タイプ値が「T1」の場合、一部のユーザーは Class_A に対する読み取りアクセス権を持ち、タイプ値が「T2」の場合、他のユーザーは読み取りアクセス権を持ちます。継承ベースのソリューションを提供しないでください。spring-security または apache shiro を使用して実行できますか?

4

3 に答える 3

2

私の知る限り、この問題をすぐに解決するプラグインはありませんが、オブジェクトへのアクセスを制限するshiroを使用してプロジェクトを実装しました。

問題は2つの別々の問題に分割されます。

a)オブジェクトへの直接アクセスを制限する-権限のないユーザーは、それらのオブジェクトへの表示ページにアクセスできないようにする必要があります

b)リストと検索をフィルタリングする-適切な権限のないユーザーは、概要リストと検索結果にそれらのオブジェクトを表示しないようにする必要があります


a)の私の解決策:

create a Filter-Class (http://grails.org/doc/latest/guide/single.html#filters) and add a before-filter for each controller which is able to show the objects which are to be secured. Within this filter, you can pre-fetch the object and check the permissions. If they don't match, you can redirect to an access denied page. (Hibernate seems to be smart enough to take you object from the cache when you request it a second time in the controller)

Btw: this way, you can also implement other implicit permissions and roles (e.g. show an object only if user has created it himself)


my Solution for b):

In most projects, you have to modify the list views and add a search. So why not simply add a search criteria as filter for the objects? If you use the criteria builder, adding an additional criteria is easy... But you have to make sure that pagination and sorting is done the right way.

Hope that helps.

于 2012-08-05T19:26:26.077 に答える
1

Apache Shiroはこれを行うことができますが、少し作業が必要です。

私のソリューションでは、従来のRBACモデルを実装し、これらのメソッドをオーバーライドするカスタムAuthorizingRealmを提供しました

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal)
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)

返されるAuthorizationInfoには、ユーザーが持つ必要のあるロールと権限が含まれている必要があります。

SimpleAuthorizationInfo authInfo= new SimpleAuthorizationInfo( acl.getRoles() );
authInfo.addStringPermissions( acl.getPermissions() );
return authInfo;

Shiroでは、権限は次のように定義されています。

domain:action:instance

したがって、この例では、この文字列のアクセス許可により、Class_AのT1インスタンスを編集できます。

Class_A:edit:T1

「すべての」アクションまたはインスタンスを許可することもできます。

Class_A:*:T1  // allow all actions
      or
Class_A:edit:* // allow edit of all instances

お役に立てれば。

于 2012-09-18T14:58:32.347 に答える
0

これでうまくいくでしょうか: http://grails.org/plugin/spring-security-acl/

于 2012-08-04T11:48:31.780 に答える