Apachehiroユーザーマニュアル(4)Realm実装
認証・認可の内部実装機構に記載されており、最終的な処理はRealに引き継いで処理することになります。これは、Shiro では、アプリケーション内のユーザー、ロール、権限の情報が最終的に Realm を通じて取得されるためです。通常、Shiro が必要とする検証情報は、Realm のデータ ソースから直接取得されます。 Realm はセキュリティフレームワークに特化した DAO と言えます
1. 認証の実装
前述の通り、Shiro の認証処理は最終的に Realm によって実行され、Realm の getAuthenticationInfo(token) メソッドが呼び出されます。
このメソッドは主に次の操作を実行します:
1. 認証のために送信されたトークン情報を確認します
2. トークン情報に基づいてデータ ソース (通常はデータベース) からユーザー情報を取得します
3. ユーザー情報の照合を実行します。検証。
4. 検証に合格すると、ユーザー情報をカプセル化した AuthenticationInfo インスタンスが返されます。
5. 検証が失敗した場合、AuthenticationException がスローされます。
アプリケーションで行う必要があるのは、Realm クラスをカスタマイズし、AuthorizingRealm 抽象クラスを継承し、doGetAuthenticationInfo() をオーバーロードし、ユーザー情報を取得するメソッドを書き直すことです。
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; User user = accountManager.findUserByUserName(token.getUsername()); if (user != null) { return new SimpleAuthenticationInfo(user.getUserName(), user.getPassword(), getName()); } else { return null; } }
2. 認可の実装
認可の実装は、カスタマイズされた Realm での doGetAuthorizationInfo() メソッドをオーバーロードし、ユーザー権限を取得するメソッドを書き換えます。
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String userName = (String) principals.fromRealm(getName()).iterator().next(); User user = accountManager.findUserByUserName(userName); if (user != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (Group group : user.getGroupList()) { info.addStringPermissions(group.getPermissionList()); } return info; } else { return null; } }
上記は、Apache での Realm 実装の内容です。Shiro ユーザー マニュアル (4) の詳細については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。