カスタムレルム認可
前提:認証は、次のように単に継承し、カスタム・レルムによる認可を達成するために、レルムの継承構造マップ・インターフェースを参照してAuthorizingRealmにメソッドをオーバーライド
第二に、実装プロセス
1、新しいModule1が、以下の依存ポンポンを追加します
< プロパティ> < shiro.version > 1.4.1 </ shiro.version > < loggingg.version > 1.2 </ loggingg.version > </ プロパティ> < 依存性> < 依存性> < のgroupId > org.apache.shiro </ のgroupId > < たartifactId >シロコア</ たartifactId > < バージョン> $ {shiro.version} </ バージョン> </依存> < 依存性> < のgroupId >コモンズロギング</ のgroupId > < たartifactId >コモンズロギング</ たartifactId > < バージョン> $ {loggingg.version} </ バージョン> </ 依存> </ 依存関係>
2、新しいクラスがあるUserRealm AuthorizingRealm、オーバーライドメソッドを継承しています
パブリッククラスあるUserRealmはAuthorizingRealm {延び プライベートUserServiceのUserServiceの=新しいUserServiceImplを(); プライベートRoleService roleService =新しいRoleServiceImpl(); プライベートPermissionService permissionService =新しいPermissionServiceImpl(); / ** *做认证 * * @paramトークン * @return * @throws含むAuthenticationException * / 保護AuthenticationInfo doGetAuthenticationInfo(AuthenticationTokenトークン)スロー含むAuthenticationException { 。文字列名= token.getPrincipal()のtoString(); System.out.println( "自定义レルム:" +ユーザー名)。 ユーザーのユーザー= userService.queryUserByUserName(ユーザー名); もし(ユーザー!= NULL){ リスト<文字列> 役割= roleService.queryRoleByUserName(ユーザー名); リスト< 文字列> 権限= permissionService.queryPermissionByUserName(ユーザー名); ActivityUser activityUser =新新ActivityUser(ユーザー、役割、権限); //パラメータ1:任意のオブジェクトを転送することができます| 2つのパラメータ:ユーザーのパスワードデータベース| 3つのパラメータ:現在のクラス名 SimpleAuthenticationInfo情報=新新SimpleAuthenticationInfo(activityUser、user.getPwd()、this.getName()); 情報を返す; }他{ リターンNULL; } } //認証方法 保護AuthorizationInfo doGetAuthorizationInfo(PrincipalCollectionプリンシパル){ SimpleAuthorizationInfo情報=新しいSimpleAuthorizationInfo()。 System.out.println( "doGetAuthorizationInfo被回调了"); // オブジェクトprimaryPrincipal = principal.getPrimaryPrincipal()。 System.out.println(primaryPrincipal)。 ActivityUser activityUser =(ActivityUser)principal.getPrimaryPrincipal(); 一覧< 文字列> 役割=のactivityUser.getRoles(); IF(!役割= NULL && roles.size()> 0){ info.addRoles(ロール); } リスト< 文字列> permissins = activityUser.getPermissins()。 (permissins!= nullの場合&permissins&.size()> 0) { info.addStringPermissions(permissins); } //判断はスーパー管理者である場合 //info.addStringPermission("*:*「); 情報を返します; }
3、試験クラス試験方法
TestAuthorizationRealmクラス公開 { パブリック静的無効メイン(文字列[] args) { // 1つのユーザ名とパスワードは、アナログ受信を送信した。 文字列名=「zhangsan」を、 文字列のパスワード=「123456」; 。2 //セキュリティマネージャ・ファクトリを作成します 工場の< セキュリティマネージャ> 工場=新新IniSecurityManagerFactory( "CLASSPATH:shiro.ini"); ... // 3は、セキュリティマネージャファクトリによってセキュリティマネージャを取得します DefaultSecurityManagerのSecurityManager =(DefaultSecurityManager)factory.getInstance(); ... // 4カスタムを作成します。レルム にあるUserRealmあるUserRealmにあるUserRealm新しい新=(); ... // 5カスタム設定レルム securityManager.setRealm(あるUserRealm)。 // 6。セキュリティマネージャは、現在のオペレーティング環境にバインドされています SecurityUtils.setSecurityManager(SecurityManagerの); ... // 7現在の環境ボディ件名ゲット 件名subject1 SecurityUtils.getSubject =(); ... // 8 loginメソッドを呼び出すボディ 試して { subject1.login(新新UsernamePasswordToken(ユーザ名、パスワード)) ; System.out.printlnは( "ログインに成功〜"); // = subject1.getPrincipal主な目的(); // System.out.printlnは(校長); }キャッチ(IncorrectCredentialsException E){ System.out.printlnは( "パスワード間違った"); }キャッチ(UnknownAccountException E){ System.out.printlnは("ユーザ名が存在しません"); } ブールROLE1 = subject1.hasRole("ROLE1" ); ブールrole2の= subject1.hasRole( "ROLE1")。 System.out.println(ROLE1)。 ブール= subject1.isPermitted(「ユーザ:加算」)を許可します。 System.out.println(許可)。 } }
第三に、分析
認証を行う場合1、認可は、コールバックメソッドは、以下を確認するレルムdoGetAuthorizationInfo自己定義された各時間後になります。
①内部認証方式にログを印刷
次のように②testクラス3回は、コンソールを表示する権限:
2、ライブラリーをチェック役割、権限、およびパッケージオブジェクトをチェックし、頻繁にチェック認証データベースのパフォーマンスの低下につながる繰り返し呼び出さないようにする認証
IVの概要
1、認可は、認証メソッドが呼び出されるたびに(印刷ログで確認することができます)
2、パフォーマンスの低下をもたらす許可データベースコールバックメソッドのチェックを回避します
図3に示すように、認証方式パラメータが(図中、そこに記載されても、パラメータのsubject.getPrincipal()メソッドによって実装される)複数回を達成するために、私はパッケージを使用する任意のパラメータに第1の認証方法を得ることができますあなたは認証方式が同じオブジェクトで呼び出す際に、頻繁にチェックライブラリを避けます