1.Shiroは、私たちを助けることができます:認証、承認、暗号化、セッション管理、ウェブとの統合、キャッシング。
2. 認証(認証):認証/ログインは、ユーザーがそのようなアカウントのパスワードとして適切なステータスを持っていないことを確認してください。
3. 許可(承認):承認、確認するために、すなわち権限は、ユーザーが権限を認証したことを確認し、そのユーザーが、このような一般的なようなことを行うことができるかどうかを決定することです:ユーザーが役割を持っていることを確認してください。またはきめの細かいユーザーがリソースに対するアクセス権を持っているかどうかを確認します。
4. セッション・マネージャ(セッション管理):セッション管理は、つまり、1つのセッションでユーザがログインした後、終了の不存在下で、それはセッション内のすべての情報があります。セッションは、通常のJava SE環境にすることができ、それは、Web環境としてすることができ;
5. 暗号化(暗号化):このような代わりの平文を格納するデータベースに格納された暗号化されたパスワードなどの暗号化、安全なデータ、。
6. Webサポート: Webサポートは非常に簡単にウェブ環境に統合することができます。
7.Caching:キャッシュは、そのようなユーザーが役割で、自分のユーザー情報をログインとして/パーミッションが、これは効率を高めることができるたびにチェックする必要はありません。
8. 並行:その結果は、スレッド内の他のスレッドで開くようしろ支持同時検証マルチスレッドアプリケーションでは、権限が自動的に過去に増殖させることができます。
9. テスト:テスト・サポートを提供します。
10. としての実行:ユーザーが別のユーザー(彼らが許可した場合)アクセスの身元にふりを許可します。
11. 私を忘れないでください:私を忘れないでください、これはつまり、最初のログイン後にして、再び次の時間が記録されてきていない、非常に共通の特徴です。
注意:史郎は、ユーザ、保守権限を維持するために行います。これらは、私たち自身の/設計する必要があるの申し出をし、次に対応するインタフェースを介して史郎するために注入することができます。
外部アーキテクチャ12.shiro
アプリケーションコードと直接対話するオブジェクトは、それは史郎の外部APIのコアが対象となり、件名であり、各APIことを意味します:
件名:ボディオブジェクト、アプリケーションコードの直接的な相互作用が対象となり、それがされたコアAPIの外史郎が対象で、現在の「利用者」に代わって、ユーザーは必ずしも特定の人ではなく、現在のアプリケーションは、対話型であるものは何でもそのようなウェブクローラ、ロボットなどの件名、;それは抽象的な概念であり、すべてがSecurityManagerのを対象にバインドされ、セキュリティマネージャがします件名の全てと対話する委託 ; SecurityManagerが実際の演奏で、件名がファサードを考慮すること。
セキュリティマネージャ:セキュリティマネージャ;それは、すべての安全関連の操作は、SecurityManagerをと相互作用している、そしてそれは、すべての件名を管理し、我々はそれがSpringMVC研究している場合、の導入の背後にある他のコンポーネントとの相互作用の役割を果たしている四郎のコアで見ることができ、あなたはDispatcherServletのフロントコントローラとしてそれを見ることができます。
レルム:ドメインは、四郎はレルムから(例えば、ユーザ、ロール、パーミッションなど)安全性データから取得し、そのユーザを認証するためにセキュリティマネージャであり、それはユーザのアイデンティティを決定するために比較されている領域から適切なユーザーを取得する必要があることは正当であるレルムから必要ユーザが動作できることを確認するために、ユーザに役割/権限を与えるために、データソース、すなわち、安全なデータソースとして缶レルム。
それは基本的に史郎です。
私たちにとって、それは、簡単なアプリケーション史郎を言うことです。
図1に示すように、アプリケーションの件名認証および許可を実行するためのコード、およびセキュリティマネージャに委託テーマ。
SecurityManagerが正当なユーザーとその権限を判断するために取得するように2は、我々は、史郎のSecurityManagerの注入レルムに必要です。
あなた上記コンテンツの一部からも簡単に見ることができる史郎メンテナンス・ユーザ/提供していない権限を、しかしレルムによって、開発者は自分自身を注入することができます。
内部構造13.shiro
件名:件名、あなたは体が「ユーザー」のアプリケーションと対話することができます何もすることができます見ることができます。
SecurityManagerの: FilterDispatcherでSpringMVCのDispatcherServletやStruts2のと同等の、史郎の心は、すべての特異的相互作用は、SecurityManagerのによって制御され、それがすべての件名を管理し、認証と承認、セッションおよびキャッシュ管理を担当しています。
オーセンティケータ:認証、認証を担当するボディ、拡張ポイントである、あなたが悪い史郎デフォルトを感じる場合は、あなたが達成するためにカスタマイズすることができ、それが必要とするユーザ認証が渡され、どのような状況の下で検討された認証ポリシー(認証戦略を)、(カスタム認証ポリシー)
Authrizer :承認者、またはアクセス制御対象が、対応する操作を実行する権限を持っているかどうかを決定するため、;ユーザーがアプリケーションにアクセスすることができ、すなわち、制御機能。
レルム:レルムの一つ以上が存在してもよい、と考えることができる、すなわち、安全なエンティティを得るために、セキュリティ・エンティティ・データ・ソース、JDBCは、LDAPがメモリを達成するために達成し、等であってもよい、達成することができ、ユーザによって提供されます。
注意:史郎は、ユーザー/権限が格納されており、どのような形式にして保存されているかわからない。私たちは、一般のアプリケーションで独自のレルムを実装する必要があります。
SessionManagerのは:あなたが書いた場合は、サーブレットは、セッションの概念を知っている必要があります、セッションがそのライフサイクルを管理するために誰かを必要とし、このコンポーネントはSessionManagerのであり、四郎は、通常のJava SE環境としても使用され、ウェブ環境だけでなく使用することができますEJBおよびその他の環境、それがすべて、史郎体とアプリケーション間のデータ交換を管理するための抽象自身のセッションに、これは、例えば、最初とWeb環境で、我々は、Webサーバーの場合です。その後、ステージEJBをオンにしますサーバー; そして、彼らは分散セッションを実現することができ、この時間を一箇所で両方のサーバーのセッションデータを望む(のようなmemcachedサーバへのデータ)。
SessionDAOは: DAO我々はCRUDセッションのために、データアクセスオブジェクトを使用している、例えば、我々はセッションにしたいが、データベースに保存され、あなたはJDBCデータベースなどによって書かれた、独自のSessionDAOを実装することができ、例えば、Memcachedのセッションを置きたいです、あなたはそれらのMemcached SessionDAOを実現することができます。加えてSessionDAOは、パフォーマンスを向上させるためにキャッシュキャッシュを使用することができます。
CacheManager :キャッシュコントローラ、ユーザー、役割、権利などを管理するために、このようなキャッシュとして、データはまれにしか変化しないようにするために、キャッシュにはアクセスのパフォーマンスを向上させることができます
暗号化:暗号モジュールは、史郎は、暗号化/復号化のためのパスワードの暗号化など、いくつかの共通のコンポーネントを向上させます。
14.フィルター
史郎は、Webプロジェクトに適用されると、史郎は、自動的にクライアントの要求をフィルタリングするためのいくつかのデフォルトのフィルタを作成します。例えば、それはそうで認証、許可、およびに関連します。デフォルトインターセプタはorg.apache.shiro.web.filter.mgt.DefaultFilter列挙子インターセプタを参照することができます。
アノン | org.apache.shiro.web.filter.authc.AnonymousFilter |
authcは | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
パーマ | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
港 | org.apache.shiro.web.filter.authz.PortFilter |
残り | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
役割 | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
SSL | org.apache.shiro.web.filter.authz.SslFilter |
ユーザー | org.apache.shiro.web.filter.authc.UserFilter |
ログアウト | org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter |
/admins/**=anon # 表示该 uri 可以匿名访问
/admins/**=auth # 表示该 uri 需要认证才能访问
/admins/**=authcBasic # 表示该 uri 需要 httpBasic 认证
/admins/**=perms[user:add:*] # 表示该 uri 需要认证用户拥有 user:add:* 权限才能访问
/admins/**=port[8081] # 表示该 uri 需要使用 8081 端口
/admins/**=rest[user] # 相当于 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等
/admins/**=roles[admin] # 表示该 uri 需要认证用户拥有 admin 角色才能访问
/admins/**=ssl # 表示该 uri 需要使用 https 协议
/admins/**=user # 表示该 uri 需要认证或通过记住我认证才能访问
/logout=logout # 表示注销,可以当作固定配置
注意:
anonが、authcBasicは、auchc、ユーザ認証は、フィルタです。
パーマ、役割、SSL、残りは、ポートフィルタが許可されています。
15.Shiro認証プロセスは、例外が可能
被験者被験者= SecurityUtils.getSubject()。 (!subject.isAuthenticated()){場合 UsernamePasswordToken usernamePasswordToken =新しいUsernamePasswordToken(ユーザ名、パスワード); usernamePasswordToken.setRememberMe(真の); {試みる subject.login(usernamePasswordToken)。 }キャッチ(UnknownAccountException電子){ System.out.print( "账户不存在:" + e.getMessage())。 }キャッチ(LockedAccountException電子){ System.out.print( "账户被锁定:" + e.getMessage())。 }キャッチ(IncorrectCredentialsException電子){ System.out.print( "密码不匹配:" + e.getMessage())。 } }
16.設定レルムrealm認証とマルチ戦略
/ *** *設定レルム * / @Bean レルムあるUserRealm(){ TestRealmあるUserRealm新しい新しいTestRealm =(); あるUserRealmを返す; } / * * * *レルムをテスト * @return * / @Bean レルムtestRealm(){ 新しい新しいを返しますTestRealm(); } / ** *マルチレルム認証ポリシー * @return * / @Bean 認証認証(){ ModularRealmAuthenticator modularRealmAuthenticator新しい新しいModularRealmAuthenticator =(); //が検証方法使用して検証することができる modularRealmAuthenticator.setAuthenticationStrategyを(atLeastOneSuccessfulStrategy ()); modularRealmAuthenticatorを返します。 } / ** *マルチreamlは、すべての認証ポリシーによって考慮されるよう * @return * / @Bean AuthenticationStrategy allSuccessfulStrategy(){ AllSuccessfulStrategy allSuccessfulStrategy新しい新しいAllSuccessfulStrategy =(); allSuccessfulStrategyを返す; } / ** *マルチ場合でもreamlによってすべての認証戦略として * @return * / @Bean AuthenticationStrategy atLeastOneSuccessfulStrategy(){ atLeastOneSuccessfulStrategy atLeastOneSuccessfulStrategy新しい新しいatLeastOneSuccessfulStrategy =(); atLeastOneSuccessfulStrategyを返します; }
17.設定のキャッシュ
@Bean 公共EhCacheManager ehCacheManager(){ 新EhCacheManager =(中EhCacheManager)。 em.setCacheManager(のCacheManager())。 em.setCacheManagerConfigFile( "クラスパス:ehcach.xml"); 見返りに、 } @Bean( "cacheManager2") のCacheManagerのCacheManager(){ (CacheManager.createを返します)。 }
18.設定のSecurityManager
/ *** *設定のSecurityManager * @return * / @Bean 公共のSecurityManagerのSecurityManager(){ DefaultWebSecurityManager SecurityManagerの新しい新DefaultWebSecurityManager =(); //単一領域を設定 SecurityManager.setRealm(あるUserRealm()); //複数の認証レルム検証で同じ長さであり得るとして 一覧<レルム> =新しい新しいレルムのArrayList <>(); realms.add(あるUserRealm()); realms.add(あるUserRealm()); securityManager.setRealms(くに); //カスタムキャッシュ実施用いRedisの // IF(Constant.CACHE_TYPE_REDIS.equals(cacheType)){ // securityManager.setCacheManager(rediscacheManager()); //他{} securityManager.setCacheManager(ehCacheManager()); } // //securityManager.setSessionManager(SessionManagerの()); //マルチReaml証明戦略 securityManager.setAuthenticator(オーセンティケータ()); セキュリティマネージャを返します; }
19.設定shiroFilterFactoryBeanファクト、ルールフィルター
/ *** *設定shiroFilterFactoryBean *設定の基本的なフィルタリングルール * @paramのSecurityManager * @return * / @Bean ShiroFilterFactoryBean shiroFilterFactoryBean(のSecurityManagerのSecurityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean新しい新ShiroFilterFactoryBean =(); //設定マネージャ shiroFilterFactoryBean.setSecurityManager(のSecurityManager) ; ランディングページに失敗した\ //のconfigureログイン\のログイン成功ページ shiroFilterFactoryBean.setLoginUrl( "/ login.htmlと"); shiroFilterFactoryBean.setSuccessUrl( "/ index.htmlを"); shiroFilterFactoryBean.setUnauthorizedUrl( "/ 403.html"); / /基本的なポリシールールを設定し、順番に作業権へのアクセスを必要とする人は、直接設定します // Antのスタイルをサポート LinkedHashMap <文字列、文字列> filterChainDefinitionMap =新しいのLinkedHashMap <>(); filterChainDefinitionMap.put( "/ login.htmlと"、 "アノン"); filterChainDefinitionMap.put( "** /ログイン/ **"、 "アノン"); filterChainDefinitionMap.put( "/ CSS / **"、 "アノン"); filterChainDefinitionMap.put( "/ JS / **"、 "アノン"); filterChainDefinitionMap.put( "/フォント/ **"、 "アノン"); filterChainDefinitionMap.put( "/ IMG / **"、 "アノン"); filterChainDefinitionMap.put( "/ドキュメント/ **"、 "アノン"); filterChainDefinitionMap.put( "/ドルイド/ **"、 "アノン"); filterChainDefinitionMap.put( "/アップロード/ **"、 " filterChainDefinitionMap.put( "/ **"、 "authcは"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap)。 shiroFilterFactoryBeanを返します。 }
20.認証コードフロー
ログインするために、第1呼Subject.login(トークン)は、自動的にセキュリティマネージャに委譲します
2、実際の認証ロジックを担当するのSecurityManager、オーセンティケータ(オーセンティケータ)への認証に委託されます。
3、オーセンティケータ(オーセンティケータ)は、独自のカスタム実装を挿入することができますコア認証エントリポイント、中に正体検証、史郎APIです。
図4に示すように、オーセンティケータは、対応AuthenticationStrategy(認証ポリシー)検証にマルチレルムアイデンティティを委託することができる、デフォルトModularRealmAuthenticatorはAuthenticationStrategyマルチレルム認証を呼び出します。
ノーリターン/例外が失敗した認証によってスローされていないがある場合5は、対応するトークン認証は、レルムが本人確認情報を取得し、レルムを渡します。ここでは、複数のレルムを設定することができ、対応する順序や戦略にアクセスされます。
21.認証例
22.Realm認証と承認
拡張AuthorizingRealm {公共TestRealmクラス @Override 保護AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken AuthenticationToken)を含むAuthenticationException {スロー // JWTの考慮事項について、パスワードまたはたいが、同時に複数のReamleを使用したい、 ; UsernamePasswordToken usernamePasswordToken =(UsernamePasswordToken)AuthenticationToken 文字列のユーザー名を= usernamePasswordToken.getUsername(); System.out.printの( "ユーザ名ヨーグルトを照会"); IF( "なし" .equals(ユーザ名)){ スロー新しい新UnknownAccountException( "ユーザーが存在しない"); } //認証エンティティ情報利用はいつでも取り出すことができた後、オブジェクトを配置することができ、JSPタグは、オブジェクトに直接行くことができる オブジェクトの校長=ユーザ名; //データベースのパスワード取得します オブジェクト=資格情報を"1234567" ; オブジェクト//データを持つパッケージは、四郎はこのオブジェクトを取ると比較トークンパスワードに渡された、ログインが成功したことを確認し SimpleAuthenticationInfo simpleAuthenticationInfo =新しいSimpleAuthenticationInfo(校長、 、のgetName資格証明書()); 返すsimpleAuthenticationInfo; } //このメソッドは許可するために使用される 着陸が一度キャッシュのみをチェックします設定した場合は、クエリを制限する権利があるかどうかを//クエリ @Overrideは AuthorizationInfo doGetAuthorizationInfo(principalCollection principalCollectionを){保護の 内部を取得する//認定SimpleAuthenticationInfo情報は=新しいSimpleAuthenticationInfo(ユーザ名、着陸され 、パスワード、のgetName()) 最初のパラメータ オブジェクト= principalCollection.getPrimaryPrincipalユーザーを(); //ユーザーにデータベースから取得し、独自のユーザーに変換されます。ロール権限 MenuService menuService = ApplicationContextRegister.getBean //(MenuService.class); //ここでの唯一の権限を照会 ; //設定<文字列> PERMSの=のmenuService.listPerms(USERID) SimpleAuthorizationInfo情報=新しい新しいSimpleAuthorizationInfoを(); //に入れます //info.setStringPermissions(perms); 情報を返します。 } }
23。
以上の5.2レルム認証ポリシー:AuthenticationStrategy
インターフェイスの•AuthenticationStrategyのデフォルトの実装:
•FirstSuccessfulStrategy:限りレルム認証があるとしてのみ最初に成功した認証レルムの認証情報を返すために成功し、他の無視。
•AtLeastOneSuccessfulStrategy:限りレルム認証があるとして成功することができ、かつ異なるFirstSuccessfulStrategyは、すべてのレルム認証が成功した認証情報で戻ります。
•AllSuccessfulStrategy:すべてのレルム認証が成功するために成功し、失敗は失敗しただろうがあれば、すべてのレルム認証が成功した認証情報で返します。•ModularRealmAuthenticatorのデフォルトの戦略はAtLeastOneSuccessfulStrategyです
コードの権限の方法:
ルール権の条項:
6.3 JSPタグ: