spring mvcを使用してユーザー認証を制御する方法

私は、ユーザマネージャシステムを構築するためにspring mvc3を使用しています。

このシステムには、以下のモデルがあります。

Department
User

部署には階層構造があります。たとえば、次のようになります。

Dep1
  SubDep1
  SubDep2
    Sub_sub_dep1
    xxxx

部門/ユーザーが自動化されている場合は追加/更新/削除できますが、部門やサブバイト内でのみこれらの操作を実行できます。

たとえば、3つの部門があります(そこにはユーザーがいます)。

Dep01(user1:{id:1}}
  Dep0101(user2:{id:2}
  Dep0102(user3:{id:3}
    Dep010201(user4:{id:4}

したがって、user1は/ add/upate /すべてのユーザーを削除できます(user1、user2、user3、user4)

user3はuser(user3、user4)に対してのみ操作を実行できます。

user3が department/list ページでuser1とuser2を見ることができないように制御できます。

しかし、彼がこのようなURLに入るのはどうですか?

department/update/1

user1(idが1)がDep0102またはDep010201に属していないため、これは避けなければなりません。

これを制御する方法は?

1

1 答え

1つのオプションは、カスタムのSpringセキュリティ PermissionEvaluator を作成し、 hasPermission(認証認証、オブジェクトtargetDomainObject、オブジェクトアクセス許可)メソッドで独自のチェックを実装することです。

保護するメソッドのシグネチャは次のようになります。

@PreAuthorize("hasRole('ROLE_USER') and hasPermission(#_dept, 'deptAndSubs')")
public String methodToProtect(String _dept)throws Exception    {
        ;
    }

hasPermission 式の最初の引数は、ユーザーが変更したい部署で、2番目はアクセス許可です。私たちのために、deptAndSubsアクセス権は、変更される部門が、ユーザーが割り当てた部門またはその部門のいずれかのサブ部門(他の権限は 'deptOnly'および 'subsOnly')と等しい場合にのみ、ユーザーがメソッドを実行できることを示します。

アプリケーションでは、Springがメソッドに渡すAuthenticationオブジェクトから直接ログインしているユーザーの部門を取得できるように、ユーザー部門コードを含むカスタムSpring Security UserDetails オブジェクトがあります。カスタムエバリュエーターが最終的に次のようになります。

    public class CustomPermissionEvaluator implements PermissionEvaluator {
           @Override
           public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
            AppUser appUser = (AppUser)authentication.getPrincipal();
            if(permission instanceof String){
                if("deptAndSubs".equals(permission)){
                    return isTargetDeptInUserDeptTree((String)targetDomainObject, appUser.getDeptCode());
                }else if(.... other permission checks){}
            }
            return false;
        }

メソッドisTargetDeptInUserDeptTreeは、ユーザーの部門ツリーを抽出し、対象部門がその部門内にあることを確認するためのカスタムコードです。

最後に、xml設定を設定する必要があります。


    



    



がんばろう!

3
追加された