2012-05-02 7 views
1

問題 MVC .NETで権限システムを作成しています。 IModelを継承するすべてのメソッドに特定の属性を強制的に適用しようとしています。例えば許可Autofac:特定のインターフェイスから継承したオブジェクトのすべてのメソッドに属性を設定する方法

public class User : IModel 
    { 
    [Permission(Admin, Moderator) 
    public User GetUser(long userId){...} 

    [Permission(Admin) 
    public User DeleteUser(long userId){...} 

    public User EditUser(long userId){...} 
    } 

は許可属性を持っているユーザーのすべてのパブリックメソッドを強制する方法はありますか?たとえば、EditUserにPermission属性がない場合、起動時に上記のコードは失敗します。

解決策

私はこの仕事をするAutofac(依存性注入)を使用して考えていました。しかし、私はまだ.NetやAutofacに精通していません。これをやり遂げる方法の提案?

答えて

1

私は反射を使用して属性の存在を検証する単体テストを作成します。

foreach(var method in typeof(User).GetMethods()) 
{ 
    var permissionAttributes = method.GetCustomAttributes(typeof(PermissionAttribute)).Cast<PermissionAttribute>(); 
} 

上記のコードはコンパイルできません - メモリからの書き込み;-)

また、あなたがメソッド呼び出しをインターセプトし、アクセス権をチェックしたい場合はinterceptorのためのgoogleしたい場合があります。 DIはあなたを助けません。

+0

thats interesting。ありがとう。そのような単体テストを書く方法や、助けてくれるサイトに私を誘導する方法のコード例を教えてください。 ソリューションはきちんと聞こえますが、(セキュリティについて話しているので)非常に安全な側にあるため、単体テストに加えて依存性注入を追加することができます。 – Karan

+0

私はインターセプターアイデアが好きです。 Autofac [http://code.google.com/p/autofac/wiki/DynamicProxy2]を使用すると、特定のインターフェースのメソッド呼び出しをインターセプトすることができます。その場合、IModelになります。誰かがこのようなことをしている[http://stackoverflow.com/questions/6238012/cannot-retrieve-customattributes-in-interceptor-using-dynamicproxy]。 – Biswanath

1

通常、コントローラではなく、コントローラ上のアクションレベルで承認を制御します。 MVCフレームワークには、すでにロールをサポートするAuthorize属性があります。

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

すべてのアクションのための許可を強制するために、コントローラ上でこの属性を配置することが可能です。

関連する問題