アパッチ・史郎カスタムレルム戦闘

カスタムレルムのプロフィール 

  一般的にカスタムレルムは今AuthorizingRealmを継承しています。

  AuthorizingRealm-> AuthenticatingRealm-> CachingRealm->レルム:継承のレルム。

ステップ

  1. AuthorizingRealmを継承するクラスを作成します。
  2. 認証方法doGetAuthorizationInfoを書き換えます。
  3. 認証方法doGetAuthenticationInfoを書き換えます。

説明メソッドをオーバーライドします

  1. ときに呼び出しdoGetAuthenticationInfoのユーザがログインします。
  2. パーミッションをチェックするときに呼び出されます:doGetAuthorizationInfo。

エンティティオブジェクト説明 

  1. UsernamePasswordToken:対応トークン史郎の校長や資格、相続ありUsernamePasswordToken-「HostAuthenticationToken-」AuthenticationToken
  2. SimpleAuthorizationInfo:ユーザーの役割の権限に代わって情報
  3. SimpleAuthenticationInfo:ユーザ認証情報の代わりに

コードの戦闘

カスタムCustomRealm

/ ** 
 * @ClassName:CustomRealm 
 *自定义レルム
 * @description:
 * @Author:Coding_wxb 
 * @Date 2019年8月2日午前2時24 
 * / 
パブリック クラス CustomRealmが拡張AuthorizingRealm {
     / ** 
     *模拟用户
     * * / 
    プライベート 最終地図<文字列、文字列> userInfoMap = 新規 HashMapの<> (); 
    { 
        userInfoMap.put( "woxbwo"、 "123" )。
        userInfoMap.put( "zbbiex"、 "456" ); 
    } 
    / ** 
     *模拟役割- >許可
     * * / 
    プライベート 最終地図<文字列、設定<文字列>> permissionMap = 新しい HashMapの<> (); 
    { 
        セットの<string> SET1 = 新しい HashSetの<> (); 
        設定して <文字列> SET2 = 新しい HashSetの<> (); 
        set1.add( "ビデオ:見つけます" ); 
        set1.add( "ビデオ:買います" ); 
        set2.add( "ビデオ:追加" ); 
        set2.add( "ビデオ:削除" ); 
        permissionMap.put( "woxbwo" 、SET1)。
        permissionMap.put( "zbbiex" 

    SET2); 
    } / **
     *模拟ユーザー- >役割
     * * / 
    民間 最終地図<文字列、設定<文字列>>ロールマップ= 新しい HashMapの<> (); { 
        セット <文字列> SET1 = 新しい HashSetの<> (); 
        設定して <文字列> SET2 = 新しい HashSetの<> (); 
        set1.add( "ROLE1" ); 
        set1.add( "role2の" ); 
        set2.add( "ルート" )。
        roleMap.put( "woxbwo" 、SET1)。
        roleMap.put( "zbbiex" 、SET2)。

    
     *该方法会在权限校验是调用
     * @ paramsは:[プリンシパル] 
     * @return :org.apache.shiro.authz.AuthorizationInfo 
     * * / 
    @Overrideが
    保護AuthorizationInfo doGetAuthorizationInfo(PrincipalCollectionプリンシパル){ 
        するSystem.out.println( "权限doGetAuthorizationInfoを" )。
        文字列名 = (文字列)principals.getPrimaryPrincipal(); 
        設定して <文字列>パーミッション= getPermissionsByNameFromDB(名); 
        設定して <文字列>の役割= getRolesByNameFromDB(名); 
        SimpleAuthorizationInfo simpleAuthorizationInfo = 新しいSimpleAuthorizationInfo();
        simpleAuthorizationInfo.setRoles(ロール); 
        simpleAuthorizationInfo.setStringPermissions(権限)
        返すsimpleAuthorizationInfoを。
    } 
    / ** 
     * @説明:
     *该方法会在用户身份认证时调用
     * @ paramsは:[トークン] 
     * @return :org.apache.shiro.authc.AuthenticationInfo 
     * * / 
    @Overrideが
    保護 AuthenticationInfo doGetAuthenticationInfo(AuthenticationTokenトークン)スロー含むAuthenticationException { 
        するSystem.out.println( "认证doGetAuthenticationInfoは" )。
        //トークンからステータス情報を取得し、ユーザ情報入力表すトークン 
        文字列名=(文字列)token.getPrincipal();
         // シミュレーションは、データベースのパスワードから採取した 
        文字列PWD = getPwdByUserNameFromDB(名前);
         IF (StringUtils.isEmpty(PWD)){
             戻り NULL ; 
        } 
        SimpleAuthenticationInfo simpleAuthenticationInfoは = 新しい新しい SimpleAuthenticationInfo(名前、PWD、この.getName());
         戻りsimpleAuthenticationInfoを; 
    } 
    / ** 
     *データベースから設定されたアナログユーザーロールを取得する
     * @paramの名前
     * @return 
     * / 
    プライベートセットの<string>getRolesByNameFromDB(文字列名){
         戻りroleMap.get(名); 

    } 

    / ** 
     *データベースアクセス権のセットからフェッチアナログ
     * @paramの名前
     * @return 
     * / 
    プライベートセットの<string> getPermissionsByNameFromDB(文字列名){
         返す(permissionMap.getを名前); 
    } 

    / ** 
     *アナログデータベースからパスワードを取得
     * @paramの名前
     * @return 
     * / 
    プライベート文字getPwdByUserNameFromDB(文字列名){
         戻りuserInfoMap.get(名); 
    } 
}

 テストクラスを作成します。

/ ** 
 * @ClassName:CustomRealmTest 
 * @description:
 * @Author:Coding_wxb 
 * @Date 2019年8月2日午前2時50分
 * / 
パブリック クラスCustomRealmTest {
     プライベート CustomRealm customRealm = 新しいCustomRealm();
    プライベート DefaultSecurityManager defaultSecurityManager = 新しいDefaultSecurityManager(); 

    @Before 
    公共 ボイドのinit(){
         // 构建环境
        defaultSecurityManager.setRealm(customRealm)。
        SecurityUtils.setSecurityManager(defaultSecurityManager)。
    } 

    @Test 
    公共 のボイドtestAuthentication(){
         // 体の現在の動作を取得 
        件名件名= SecurityUtils.getSubjectを();
         // ユーザーアカウントのパスワードを入力 
        UsernamePasswordToken usernamePasswordToken = 新新 UsernamePasswordToken( "woxbwo"、 "123" ); 
        subject.login(usernamePasswordToken); 
        / / ログ 
        のSystem.out.println( "認証結果:" + subject.isAuthenticatedを()); 

        // プロパティは、ボディマークを取得 
        するSystem.out.println( "getPrincipal =" + subject.getPrincipal()); 
        subject.checkRole( "ROLE1" ); 
        のSystem.out.println( "対応する役割がある:" + subject.hasRoleは( "ROLE1" ));
        System.out.println( "対応する権限がある場合:" + subject.isPermitted( "ビデオ:追加" )); 

    } 
}

テスト結果

認定doGetAuthenticationInfoの
認証結果:trueに
getPrincipal = woxbwo 
権doGetAuthorizationInfo 
doGetAuthorizationInfo権
:対応する役割があるかどうかをtrueに
権限doGetAuthorizationInfo 
対応する権限があるかどうか:

 

おすすめ

転載: www.cnblogs.com/woxbwo/p/11286299.html