カスタムレルムのプロフィール
一般的にカスタムレルムは今AuthorizingRealmを継承しています。
AuthorizingRealm-> AuthenticatingRealm-> CachingRealm->レルム:継承のレルム。
ステップ
- AuthorizingRealmを継承するクラスを作成します。
- 認証方法doGetAuthorizationInfoを書き換えます。
- 認証方法doGetAuthenticationInfoを書き換えます。
説明メソッドをオーバーライドします
- ときに呼び出しdoGetAuthenticationInfoのユーザがログインします。
- パーミッションをチェックするときに呼び出されます:doGetAuthorizationInfo。
エンティティオブジェクト説明
- UsernamePasswordToken:対応トークン史郎の校長や資格、相続ありUsernamePasswordToken-「HostAuthenticationToken-」AuthenticationToken
- SimpleAuthorizationInfo:ユーザーの役割の権限に代わって情報
- 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 対応する権限があるかどうか:偽