シロ
Apache Shiroは、軽量認証と承認のフレームワークです。 Spring Securityと比較して、簡単で使いやすく、柔軟性が高くなります。 Springboot自体はセキュリティのサポートを提供しますが、結局のところ、それはそれ自身のものです。 Springbootは当面の間Shiroを統合していないので、自分で一致させる必要があります。
1.依存関係を追加します
<Dependency> groupId> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <version> 1.2.5 </version> </dependency> <dependency> <groupid> org.shiro.shiro </groupid> <artifactid> shiro-ehcache
2。シロ構成クラスを書きます
パッケージcom.xbz.web.system.config; Import at.pollux.thymeleaf.shiro.dialect.shirodialect; org.apache.shiro.authc.credential.credentialSmatcherをインポートします。 org.apache.shiro.authc.credential.hashedcredentialsmatcherをインポートします。 org.apache.shiro.cache.ehcache.ehcachemanagerをインポートします。 Import org.apache.shiro.codec.base64; Import org.apache.shiro.session.sessionListener; org.apache.shiro.session.mgt.sessionmanagerをインポートします。 org.apache.shiro.session.mgt.eis.memorysessiondaoをインポートします。 org.apache.shiro.session.mgt.eis.sessiondaoをインポートします。 org.apache.shiro.spring.lifecybeanpostprocessorをインポートします。 org.apache.shiro.spring.security.interceptor.authorizationAttributesourceadvisorをインポートします。 Import org.apache.shiro.spring.web.shirofilterfactorybean; org.apache.shiro.web.mgt.cookieremembermemanagerをインポートします。 org.apache.shiro.web.mgt.defaultwebsecuritymanagerをインポートします。 org.apache.shiro.web.servlet.simplecookieをインポートします。 Import org.apache.shiro.web.session.mgt.defaultwebsessionmanager; Import org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator; Import org.springframework.boot.autoconfigure.condition.condition.conditionalonmissingbean; org.springframework.context.annotation.beanをインポートします。 org.springframework.context.annotation.configurationをインポートします。 org.springframework.context.annotation.dependsonをインポートします。 java.util.arraylistをインポートします。 java.util.collectionをインポートします。 java.util.linkedhashmapをインポートします。 java.util.mapをインポートします。 /*** Shiro Configurationクラス* Apacheshiro Coreは、SpringMVCがDispachServletを使用して要求配信を制御するように、フィルターを介した許可制御と傍受を実装します。 *フィルター、つまり、URLルールを介したフィルタリングと許可の検証を使用しているため、URLSに関する一連のルールとアクセス権を定義する必要があります* / @Configuration Public Class ShiroconFiguration { / *** DefaultAdvisorautoproxyCreator、A Bean of Spring、およびAdvisorは、どのクラスの方法をAOP Proxyに決定します。 */ @bean @conditionalonmissingbean public defaultadvisorautoproxycreator defaultadvisorautoproxycreator(){defaultadvisorautoproxycreator defaultaap = new defaultadvisorautoproxycreator(); defaultaap.setProxyTargetClass(true); defaultaapを返します。 } /*** shirofilterfactorybean:shirofilterを生成するには、リソースファイルの傍受を処理します。 *主に、SecurityManager、フィルター、FilterChainDefinitionManagerの3つのデータ項目を維持しています。 *注:単一のshirofilterfactorybean構成はエラーであるか、エラーを報告します。shirofilterfactorybeanを初期化する場合、securitymanager * * filterchain定義の説明 * 1。役割 * */ @bean public shirofilterfactorybean shirofilterfactorybean(){shirofilterfactorybean shirofilterfactorybean = new shirofilterfactorybean(); shirofilterfactorybean.setsecuritymanager(securitymanager()); shirofilterfactorybean.setloginurl( "/login"); // login.jspページをWebプロジェクトのルートディレクトリで設定しないでくださいshirofilterfactorybean.setuccessurl( "/index"); //カスタムインターセプター、複数のフィルターの設定*// Map <String、Filter> Filters = new LinkedHashmap <>(); // logoutfilter logoutfilter = new logoutfilter(); //同じアカウントのオンライン番号の数を同時に制限します。またはシングルサインオンなど。 // filters.put( "logout"、null); // shirofilterfactorybean.setfilters(フィルター); map <string、string> filterchaindefinitionmap = new linkedhashmap <>(); // FilterChainDefinitionManagerは、整然とfilterchaindefinitionmap.put( "/css/**"、 "anon")を確保する必要があるため、LinkedHashmapである必要があります。 //静的リソースは、他のディレクトリ(JS、IMGなど)およびFilterChainDefinitionMap.put( "/"、 "anon")にファイルがある場合、権限を必要としません。 FilterChainDefinitionMap.put( "/login"、 "anon"); // url filterchaindefinitionmap.put( "/logout"、 "logout")の部分を構成します; FilterChainDefinitionMap.put( "/user/**"、 "authc、choles [role_user]"); //ユーザーはアクセスするロール_userロールです。ユーザーの役割はユーザーの動作を制御します。 FilterChainDefinitionMap.put( "/events/**"、 "authc、choles [role_admin]"); // FilterChainDefinitionMap.put( "/user/edit/**"、 "authc、perms [user:edit]"); //テストの場合、死んだ値は固定されており、データベースまたはその他の構成から読み取ることもできます。ここでは、権限を使用してFilterChainDefinitionMap.put( "/**"、 "authc")を制御します。 //ログインする必要があるリソース、通常は下部のshirofilterfactorybean.setfilterchaindefinitionmap(filterchaindefinitionmap); shirofilterfactorybeanを返します。 } //リージョンクッキーとセッション// ===================================================== /** Cookie Object Management*/public SimpleCookie RememberMecookie(){//このパラメーターは、フロントエンドのチェックボックスの名前に対応するCookieの名前です= Rememberme SimpleCookie simplecookie = new simplecookie(cookie_name); SimpleCookie.setMaxage(604800); //私のCookieが7日間有効になっていることを忘れないでください。ユニットはSimpleCookieを返します。 } / ** Cookie Management Object:remember me function* / public cookieremembermemanager remembermemanager(){cookieremembermemanager cookieremembermemanager = new Cookieremembermemanager(); cookieremembermemanager.setcookie(remembermecookie()); Cookieremembermemanager.setcipherkey(base64.decode( "3avvhmflus0kta3kprsdag ==")); } @Bean SessionDao sessiondao(){return new MemorySessionDao(); } @bean public sessionmanager sessionmanager(){defaultwebsessionmanager sessionmanager = new defaultwebsessionmanager();コレクション<SessionListener>リスナー= new ArrayList <>(); listens.add(new bdsessionlistener()); sessionmanager.setsessionListeners(リスナー); sessionmanager.setsessiondao(sessiondao()); Return SessionManager; } // ========================================================================================= ***セキュリティマネージャー:コアセキュリティトランザクションマネージャー、許可管理*このクラスは、ログイン、ログアウト、およびセッション処理を組み合わせています。比較的重要なクラスです。 */ @bean(name = "securitymanager")public defaultwebsecuritymanager securitymanager(){defaultwebsecuritymanager securitymanager = new defaultwebsecuritymanager(); securitymanager.setrealm(shirorealm()); SecurityManager.setCacheManager(ehcacheManager()); ////ユーザー認証/認証情報キャッシュ、ehcacheキャッシュの使用//注入マネージャーを覚えておいてください。 SecurityManager.setRememberMemanager(remembermemanager()); Return SecurityManager; } /** * shiroreAlm、これは承認済みのリアルムから継承されたカスタム認証クラスであり、 *ユーザー認証と許可処理を担当する、JDBCREALMの実装を参照できます。 */ @bean @dependson( "lifecyclebeanpostprocessor")public shirorealm shirorealm(credentialsmatcher matcher){shirorealm realm = new shirorealm(); realm.setcredentialsmatcher(matcher); //パスワード検証は、return remolmを実装します。 } /*** ehcachemanager、cachemanager*ユーザーが正常にログインした後、ユーザー情報と許可情報をキャッシュし、ユーザーが要求するたびにユーザーのセッションに入れます。このBeanが設定されていない場合、各リクエストに対してデータベースは一度照会されます。 */ @bean @dependson( "lifecyclebeanpostprocessor")public ehcachemanager ehcachemanager(){ehcachemanager em = new ehcachemanager(); em.setCachemanagerconfigfile( "classpath:config/ehcache.xml"); //構成ファイルパスreturn em; } /** * LifeCycleBeanPostProcessor、これはDestructionAwareBeanPostProcessorのサブクラスです。 *主に承認済みのリアルムクラスのサブクラスであり、ehcachemanagerクラスです。 */ @bean(name = "lifecyclebeanpostprocessor")public lifecyclebeanpostprocessor lifecyclebeanpostprocessor(){return new lifecyclebeanpostprocessor(); } /** * HashedCredentialSmatcher、このクラスはパスワードをエンコードするためのもので、パスワードがデータベースに明確に保存されないようにします。もちろん、認証にログインする場合、 *このクラスはフォームに入力されたパスワードをエンコードする責任があります *処理認証マッチングプロセッサ:カスタマイズがHashedCredentialSmatcherの継承を必要とする場合 */ @Bean(name = "HashedCredentialSmatcher")Public HashedCredentialSmatrerstertienter( credentientsmatcher = new HashedCredentialSmatcher(); credentientsmatcher.sethashalgorithmname( "md5"); //暗号化方法を指定すると、ここでキャッシュを追加することもできます。ユーザーが5つ以上のログインエラーをログインすると、ユーザーはロックされます。ユーザーは、Scredentientsmatcher.SethaShiterations(2)を常にログインしようとすることを禁止されています。 credentientivelysmatcher.setStoredCreDentialShexenCoded(true); return credentientsmatcher; } /** * authorizationAttributesourceadvisor、shiroに実装されたアドバイザークラス *を使用して、aopallianceannotationsauthorizingmethododitinterceptorを内部的に使用して、次の注釈でメソッドを迎撃します。 */ @Bean Public AutherizationAttributesOurCeadVisor AutherizationAttributeSourCeadVisor(){AutherizationAttributesOurCeadVisor Advisor = new AutherizationAttributesOurCeadVisor(); advisor.setsecuritymanager(securitymanager());返品アドバイザー。 } // @bean public shirodialect shirodialect(){return new shirodialect(); }} 3.レルム検証クラスをカスタマイズします
パッケージcom.yyun.web.system.config; com.yyun.dao.master.userdaoをインポートします。 com.yyun.domain.userdoをインポートします。 com.yyun.web.common.utils.shiroutilsをインポートします。 com.yyun.web.system.service.menuserviceをインポートします。 Import org.apache.shiro.securityutils; org.apache.shiro.authc。*; org.apache.shiro.authz.authorizationinfoをインポートします。 org.apache.shiro.authz.simplauthorizationinfoをインポートします。 org.apache.shiro.realm.authorizingRealmをインポートします。 Import org.apache.shiro.session.session; org.apache.shiro.subject.principalcollectionをインポートします。 Import org.springframework.beans.factory.annotation.autowired; Java.util。*をインポートします。 / ***ユーザーの役割と許可情報を取得*/パブリッククラスShiroreAlmは承認realmを拡張します{//一般に、ここに書かれているのはServic @Autowired Private UserDao Usermapperです。 @autowired private menuservice menuservice; /***ログイン認証一般的に言えば、ログインした後、現在のユーザーに許可が付与されます。このステップは、dogetauthenticationinfoに基づいています。ユーザー情報の後にのみ、ユーザーの役割と承認情報に基づいてユーザーを承認するかどうかを判断できます。したがって、ここでの役割と権限ユーザーの2つの重要な判断基準はあります * @param authenticationToken * @return * @throws exhincectioncection */ @Override Protected AuthenticationInfo dogetauthenticationInfo(AuthenticationToken AuthenticationToken)スローAuthendicationException {usernamepasswordwordtoken token =(usernamepassokentokentoken; userdo user = usermapper.findbyname(token.getUsername()); //このユーザーがいる場合は、(user!= null){//このユーザーをログイン認証情報に保存し、パスワードを自分で比較する必要はありません。 shiroは、米国のパスワード比較と検証を実行します<urole> rlist = uroledao.findrolebyuid(user.getid()); //ユーザーロールリスト<upermission> plist = upermissiondao.findpermissionbyuid(user.getid()); List <String> permissionsStrlist = new ArrayList <String>(); ///ユーザーの許可コレクション(urole role:rlist){rolestrlist.add(role.getname()); } for(upermission upermission:plist){perminsstrlist.add(upermission.getName()); } user.setRolestrlist(Rolestrlist); user.setperminsstrlist(perminsstrlist);セッションセッション= securityutils.getSubject()。getSession(); session.setAttribute( "user"、user); // succeds session //存在する場合は、このユーザーをログイン認証情報に保存してください。パスワードを自分で比較する必要はありません。 Shiroは、パスワードの比較検証を実行します。 new SimpleAuthenticationInfo(user、user.getPassWord()、getName()); } nullを返します。 } / ***許可認証*ユーザーの許可情報を取得します。これは、承認の次のステップの判断を下し、現在のユーザーの役割とこれらの役割が所有する許可情報を取得するためです* @param principalcollection* @return* / @Override保護された認可承認info dogetauthorizationinfo(プリンシパルコレクションempteent epented in ugin in ugin in the user exte theユーザーがto(string)principalcollection.fromrealm(getname())。iterator()。next(); // string loginname =(string)super.getAvailablePrincipal(spinitalCollection); userdo user =(userdo)rignicalcollection.getPrimaryPrincipal(); // //データベースに移動して、このオブジェクトが存在するかどうかを確認します//ユーザー= null; //実際のプロジェクトでは、実際の状況に応じてキャッシュできます。そうでない場合、シロ自身には時間間隔メカニズムがあり、2分以内にメソッドを繰り返し実行しません// user = usermapper.findbyname(loginname); if(user!= null){//許可情報オブジェクト情報は、見つかったユーザーのすべての役割(役割)と許可(許可)を保存するために使用されます。 //ユーザーのロールコレクションinfo.addroles(user.getrolestrlist()); //ユーザーの許可コレクションinfo.addstringpermissions(user.getPerminsStrlist());情報を返す; } // nullを返し、ユーザーは傍受された要求にアクセスして、Unauthorizedurlによって指定されたアドレスに自動的にジャンプします。 }}4.最後に、ehcacheの構成ファイルを見てみましょう
<?xml version = "1.0" encoding = "utf-8"?> <ehcache xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation = "http://ehcache.org/ehcach.xds" <diskstore path = "java.io.tmpdir /tmp_ehcache" /> <! - name:cache name。 MaxElementsInmemory:キャッシュの最大数maxelementsondisk:ハードディスクの最大キャッシュ数。永遠:オブジェクトが永続的に有効であるかどうか、設定すると、タイムアウトは機能しません。 OverflowTodisk:ディスクに保存するかどうか、タイムトイドルズセカンド:有効期限が切れる前に、オブジェクトの許可されたアイドル時間(ユニット:秒)を設定します。 Eternal = Falseオブジェクトが永続的に有効でない場合にのみ使用されます。オプションの属性、デフォルト値は0です。つまり、アイドル時間は無限です。 TimetoliveseConds:失効する前にオブジェクトの時間(単位:秒)を設定します。最大時間は、作成時間と故障時間の間です。 Eternal = Falseオブジェクトが永続的に有効でない場合にのみ使用されます。デフォルトは0です。つまり、オブジェクトのサバイバル時間は無限です。 DiskPerSistent:Disk Storeが仮想マシンの再起動の間に持続するかどうか。デフォルト値はfalseです。 diskspoolbuffersizemb:このパラメーターは、ディスクストアのキャッシュサイズ(ディスクキャッシュ)を設定します。デフォルトは30MBです。各キャッシュには独自のバッファが必要です。 DiskexPirythReadIntervalseConds:ディスク障害スレッドの実行時間間隔、デフォルトは120秒です。 MemoryStoreEvictionPolicy:MaxElementsInmemoryの制限に到達すると、Ehcacheは指定されたポリシーに従ってメモリをクリーンアップします。デフォルトのポリシーはLRU(最近では使用されています)です。 FIFO(First In、First Out)またはLFU(使用が少ない)に設定できます。 ClearOnFlush:メモリの量が最大であることをクリアするかどうか。 MemoryStoreEvictionPolicy:ehcacheの3つのクリアリング戦略。 FIFO、最初は最初に、これは誰にとっても最も馴染みのあるものであり、最初は最初です。 LFUはあまり頻繁に使用されていませんが、上記の例で使用される戦略です。鈍くするためには、それがこれまでに使用されていないと言うことです。上記のように、キャッシュされた要素にはヒット属性があり、最低ヒット値はキャッシュからクリアされます。 LRUは最近使用されていないため、キャッシュされた要素にはタイムスタンプがあります。キャッシュ容量がいっぱいで、新しい要素をキャッシュする余地を作る必要がある場合、既存のキャッシュ要素の最も遠い時間の要素がキャッシュからクリアされます。 - > <defaultCache ETERNAL = "false" maxElementsInmemory = "1000" Overflowtodisk = "false" diskpersistent = "false" TimetoIdLeseConds = "0" TimetoliveseConds = "600" MemoryStoreEvictionPolicy = "LRU" /> <! maxentrieslocalheap = "2000" eter = "false" TimetoidLeseConds = "3600" TimetolivesConds = "0" Overflowtodisk = "false" statistics = "true"> </cache> </ehcache>
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。