Apache Shiroは、認証、承認、セッション管理、暗号化などのエンタープライズレベルのアプリケーションで一般的なセキュリティ制御プロセスを処理する強力で柔軟なオープンソースセキュリティフレームワークです。 Apache Shiroの主な目標は、使いやすさと理解です。セキュリティプロセス制御は非常に複雑になる場合がありますが、これは開発者にとって頭痛ですが、必ずしもそれを意味するわけではありません。フレームワークは、複雑さを可能な限りマスクし、簡潔で直感的なAPIを公開し、それにより開発者の作業を簡素化し、アプリケーションのセキュリティを確保する必要があります。今回は、Shiroを使用してSpring Webアプリケーションに許可制御を実装する方法について説明します。
関数
Apache Shiroは、多くの機能を備えた包括的なアプリケーションセキュリティフレームワークです。次の図は、シロで最も重要な機能を示しています。
Shiroの主な目標は、「アプリケーションセキュリティの4つの礎石」 - 認証、承認、セッション管理、暗号化です。
建築
全体的な観点から、Shiroのアーキテクチャには3つの主要な概念があります:件名(サブジェクト、つまり、ユーザー)、セキュリティマネージャー(セキュリティマネージャー)、レルム(ドメイン)。次の図は、これらのコンポーネント間の関係を説明しています。
これらのコンポーネントは次のように理解できます。
データの準備
Webアプリケーションでは、セキュリティに対する主な制御は、役割、リソース、およびアクセス許可です(どの役割がリソースにアクセスできますか)。ユーザーは複数の役割を持つことができ、役割は複数のリソースにアクセスすることもできます。つまり、役割は複数の権限に対応できます。データベース設計を実装するには、ユーザーテーブル、ロールテーブル、リソーステーブル、ロールリソーステーブル、ユーザーロールテーブルの5つのテーブルを構築する必要があります。これらの5つのテーブルの構造は次のとおりです。
ユーザーテーブル:
| id | ユーザー名 | パスワード |
|---|---|---|
| 1 | チャン・サン | 123456 |
| 2 | li si | 6666666 |
| 3 | 王ウー | 000000 |
ロールリスト:
| id | ロレナム |
|---|---|
| 1 | 管理者 |
| 2 | マネージャー |
| 3 | スタッフ |
リソーステーブル:
| id | 再名 |
|---|---|
| 1 | /user/add |
| 2 | /ユーザー/削除 |
| 3 | /compony/info |
ロールリソーステーブル:
| id | roleid | 残り |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
ユーザーロールテーブル:
| id | ユーザーID | roleid |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
対応するPojoクラスは次のとおりです。
/***ユーザー*/パブリッククラスユーザー{private integer id;プライベート文字列ユーザー名;プライベート文字列パスワード。 // getter&setter ...} /***役割*/パブリッククラスの役割{private string id;プライベートストリングロレナム;} /***リソース*/パブリッククラスリソース{private string id;プライベート文字列resname;} /***ロールリソース*/public class roleres {private string id;プライベート文字列RoleId;プライベートストリング残基;} /***ユーザーロール*/public class userrole {private string id; Private String userid;プライベートストリングロールイド;} SpringとShiroを統合するための詳細な手順については、私のブログ「SpringアプリケーションのApache Shiroの統合」を参照してください。ここに追加します。Shiroの依存関係を事前に紹介し、MVNRepository.comをオープンし、Shiroを検索する必要があります。最初の3つの依存関係、すなわちシロコア、シロウェブ、シロスプリングが必要です。 Mavenプロジェクトを例にとると、 pom.xmlの<dependencies>ノードの下に次の依存関係を追加します。
<依存関係> groupId> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <bersion> 1.4.0 </version> </dependency> <dependency> groupid> org.apache.shiro </groupid> <artifactid> shiroweb </artifactid> </</</</</</</</</</</biversion <groupid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <バージョン> 1.4.0 </version> </dependency>
application-context.xmlこのようなshiroFilter Beanを構成する必要があります。
<! - shiroのフィルターファクトリークラスを構成する、id-shirofilterはweb.xmlで構成したフィルターと一致する必要があります - > <bean id = "shirofilter"> <プロパティ名= "securitymanager" ref = "securitymanager"/> <! - loginページ - > <プロパティname = "login"/login "/login"/> < name = "rescresurl" value = "/index"/> <! - ジャンプページへの違法アクセス - > <プロパティ名= "unauthorizedurl" value = "/403"/> <! - 許可設定 - > <プロパティ名= "filterchaindefinitions"> <値> <!上記で無視されたリソースは、他のすべてのリソースにアクセスする前に認証する必要があります - >/** = authc </value> </property> </bean>
次に、領域を定義する必要があります。カスタムレルムは、 AuthorizingRealmクラスから統合されています。
Public Class MyRealMは、AuthorizingRealM {@Autowired Private Userservice userserviceを拡張します。 / ***検証許可*/ @Override Protected AuthorizationInfo dogetAuthorizationInizationfo(プリンシパルコレクションプリンシパルコレクション){string loginname = securityutils.getSubject()。getPrincipal()。 if(loginname!= null){string userid = securityutils.getSubject()。getSession()。getAttribute( "usersessionId")。toString(); //許可情報オブジェクト。見つかったユーザーのすべての役割と権限を保存するために使用されますsimpleauthorizationinfo info = new SimpleAuthorizationInfo(); //ユーザーロールコレクションShirouser Shirouser =(Shirouser)frictaniceCollection.getPrimaryPrincipal(); info.setroles(shirouser.getroles()); info.addstringpermissions(shirouser.geturlset());情報を返す; } nullを返します。 } / ** *認証コールバック関数、call * / protected authenticationinfo dogetauthenticationinfo(authenticationTokenトークン){string username =(string)token.getPrincipal(); user user = new user(); sysuser.setusername(username); {list <sysuser> users = userservice.findbynames(user); List <String> Rolelist = userservice.selectrolenameListbyUserid(users.get(0).getId()); if(users.size()!= 0){string pwd = users.get(0).getPassWord(); //すべての検証が渡された後、ユーザー情報をセッションセッション= securityutils.getSubject()。getSession(); session.setattribute( "usersession"、users.get(0)); session.setattribute( "usersessionId"、users.get(0).getid()); session.setattribute( "userroles"、org.apache.commons.lang.stringutils.join(rolelist、 "、")); new simpleauthenticationinfo(username、users.get(0).getpassword())を返します。 } else {//ユーザーが見つかりませんでした新しいunknownaccountexception(); }} catch(Exception E){System.out.println(e.getMessage()); } nullを返します。 } /***ユーザー認証情報キャッシュを更新します。 */ public void clearCachedAuthorizationInfo(プリンシパルコレクションプリンシパル){super.ClearCachedAuthorizationInfo(プリンシパル); } /***ユーザー情報キャッシュを更新します。 */ public void clearCachedAuthenticationInfo(プリンシパルコレクションプリンシパル){super.ClearCachedAuthenticationInfo(プリンシパル); } /***ユーザー認証情報キャッシュをクリアします。 */ public void clearallCachedAuthorizationInfo(){getAuthorizationCache()。clear(); } /***ユーザー情報キャッシュをクリアします。 */ public void clearallCachedAuthenticationInfo(){getAuthenticationCache()。clear(); } / ***すべてのキャッシュをクリア* / public void clearcache(spinitalCollectionプリンシパル){super.clearcache(spincipals); } / ***すべての認証キャッシュ* / public void clearallcache(){clearallCachedAuthenticationInfo(); ClearallCachedAuthorizationInfo(); }}最後に、ユーザーログインのコントローラーを定義して、ユーザーログイン要求を受け入れます。
@controllerpublic class usercontroller {/*** user login*/@postmapping( "/login")public string login(@valid userユーザー、bindingResult bindingResult、redirectattributes redirectattributes){try {if(bindindResult.haserrors(){return "lotin"; } //認証に許可ツールを使用して、正常にログインした後、Shirofilter bean securityutils.getSubject()で定義されたsuccessurlにジャンプします。login(new usernamepasswordtoken(user.getusername()、user.getpassword()); "redirect:index"を返します。 } catch(authenticationexception e){redirectattributes.addflashattribute( "message"、 "エラーユーザー名またはパスワード"); "redirect:login"を返します。 }}/*** logout*/@getMapping( "/logout")public string logout(redirectattributes redirectattributes){securityutils.getSubject()。logout(); "redirect:login"を返します。 }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。