序文
Shiroは許可フレームワークです。特定の使用のために、公式のWebサイトhttp://shiro.apache.org/を確認できます。非常に便利な許可認証とログイン機能を提供します。
オープンソースのフレームワークとして、SpringbootはShiroと統合された関数を提供する必要があります!
Shiroは以前にプロジェクト認証に使用されていました。スプリングMVCでより頻繁に使用され、XMLで構成されています。シロを許可管理に使用することは比較的単純で成熟しています。さらに、私は常にMongodbにShiroのセッションを掲載しています。これは、Mongodbの元の設計意図にもっと合っています。分散プロジェクトでは、MongoDBは中間層としても使用されます。これは、分散環境でのセッション同期の問題を簡単に解決するために使用されます。
Springbootがリリースされたため、私のプロジェクトは基本的にSpringbootを使用できます。また、Mavenを使用して統一された集中管理にも非常に便利です。 Springbootは一連の許可セキュリティフレームワークSpring Securityも提供しますが、比較的あまり役に立たないため、Shiroを使用する方が便利です。 ShiroとのSpringbootの統合は、少なくともXML構成の束がなければ、スプリングMVCよりもはるかに簡単です。
この方法は次のとおりです。
最初のステップは、最初にMavenにShiroとMongoの依存関係を追加することです。私が使用するシロバージョンはです
<shiro.version> 1.2.3 </shiro.version>
依存関係を追加:
<Dependency> groupid> org.apache.shiro </groupid> <artifactid> shiro-core </artifactid> <version> $ {shiro.version} </version> </dependency> <seplency> <groupd> org.apache.shiro </groupid> <artifactid> shiro-web </artifactid> <バージョン> $ {shiro.version} </version> </dependency> <dependency> <groupid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <バージョン> $ {shiro.version} </version> depence> <Artifactid> shiro-spring </artifactid> <version> $ {shiro.version} </version> </dependency> <dependency> <groupdb </groupid> <artifactid> mongo-java-driver </artifactid> <バージョン> <GroupId> org.springframework.data </groupid> <artifactid> spring-data-mongodb </artifactid> <バージョン> 1.7.0.release </version> </dependency>次に、application.xmlまたはymlでmongodbを構成します
spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
構成が完了したら、Shiro Authentication Codeを正式に書き始め、最初に認証領域をカスタマイズし、承認realmから継承します
パブリッククラスShirodbrealmは、承認realm { / ***ユーザー情報操作* / private systemuserservice systemuserserviceを拡張します。 public shirodbrealm(){} public shirodbrealm(SystemUserservice SystemUserService){this.systemuserservice = SystemUserService; } / ***認可情報* / @Override Protected AuthorizationInfo dogetauthorizationinfo(simpleauthorizationinfo info =(simpleauthorizationinfo)shirokit.getshirosessionttr( "perms"); if(null!= info &&!collectutils.isempty(info.getRoles())&&!collectutils.isempty(info.getStringPermissions())){return info; } nullを返します。 } / ***認証情報* /保護されたAuthenticationInfo dogetauthenticationinfo(authenticationToken authctoken)Sthrows authenticationexception {usernamepasswordtoken token =(usernamepasswordtoken)authctoken; string username = token.getusername(); if(username!= null &&! ""。equals(username)){systemuser key = new SystemUser(); key.setloginname(token.getusername()); key.setPassWord(String.ValueOf(token.getPassWord())); SystemUser user = systemuserservice.login(key); if(user!= null){件名usertemp = securityutils.getSubject(); usertemp.getSession()。setAttribute( "userId"、user.getId()); usertemp.getSession()。setAttribute( "username"、user.getusername()); new SimpleAuthenticationInfo(user.getLoginName()、user.getPassWord()、getName())を返します。 }} nullを返します。 }}Mongodbのリポジトリと実装にセッションを保存します。
パブリックインターフェイスShirosessionRepository { / ** * * @param Session * / void Savessession(セッションセッション); ......}MongodbsessionRepository.java
Public Class MongodBssessionRepositoryは、shirosessionrepository {private mongotemplate mongotemplate; public mongodbsessionRepository(){} public mongodbsessionRepository(mongotemplate mongotemplate){this.mongotemplate = mongotemplate; } @Override public void savessession(セッションセッション){if(session == null || session.getId()== null){return; } sessionbean bean = new SessionBean(); bean.setkey(getsessionkey(session.getid())); bean.setValue(serializeutil.serialize(session)); bean.setprincipal(null); bean.sethost(session.gethost()); bean.setstarttimestamp(session.getStartTimestamp()); bean.setlastaccesstime(session.getLastaccessTime()); bean.settimeouttime(gettimeouttime(session.getStartTimestamp()、session.getTimeout())); mongotemplate.insert(bean); } ......}shirosessiondao.java
パブリッククラスのshirosessiondaoは、abstractsessiondao { / *** logger* / private static final logger log = loggerfactory.getlogger(shirosessiondao.class); / ***データベースストレージ*/ private shirosessionRepository shirosessionRepository; / ** * @return */ public shirosessionRepository getShirosessionRepository(){return shirosessionRepository; } / ** * * @param shirosessionRepository * / public void setshirosessionRepository(shirosessionRepository shirosessionRepository){this.shirosessionRepository = shirosessionRepository; } @override public void update(セッションセッション)unknownssessionexception {getshirosessionRepository()。updatessession(session); } @Override public void delete(session session){if(session == null){log.Error( "セッションはnullになりません、削除failed");戻る; } serializable id = session.getId(); if(id!= null){getshirosessionRepository()。deletessession(id); }} @Overrideパブリックコレクション<session> getActivesEssions(){return getshirosessionRepository()。getallsessions(); } @Override Protected Serializable docreate(セッションセッション){serializable sessionId = this.generateSessionId(session); this.AssignSessionID(SESSION、SESSIONID); getshirosessionRepository()。savessession(session); Return SessionId; } @Override Protected Session DoreadSession(Serializable SessionID){return getshirosessionRepository()。 }}わかりました!すべての基本クラスが完了し、最終的にShiroを初期化して構成する構成を書き込みます
@configurationpublic class shiroconfig {@resource private mongotemplate mongotemplate; @Resource Private SystemUserService SystemSerservice; //これは、ユーザー名とパスワードを決定するために使用されるサービスです@Bean Public ShirofilterfactoryBean Shirofilter(DefaultWebseCurityManager SecurityManager){Shirofiltorybean Shirofilterfactorybean = new Shirofilterfactorybean(); shirofilterfactorybean.setsecuritymanager(securitymanager); shirofilterfactorybean.setloginurl( "/login"); shirofilterfactorybean.setsuccessurl( "/index"); shirofilterfactorybean.setunauthorizedurl( "/403"); //インターセプター。 map <string、string> filterchaindefinitionMap = new linkedhashmap <string、string>(); FilterChainDefinitionMap.put( "/static/**"、 "anon"); FilterChainDefinitionMap.put( "/ajaxlogin"、 "anon"); FilterChainDefinitionMap.put( "/libs/**"、 "anon"); FilterChainDefinitionMap.put( "/images/**"、 "anon"); FilterChainDefinitionMap.put( "/logout"、 "logout"); FilterChainDefinitionMap.put( "/**"、 "authc"); shirofilterfactorybean.setFilterChainDefinitionMap(FilterChainDefinitionMap); shirofilterfactorybeanを返します。 } public AutherizationAttributeSourCeadVisor AutherizationATTRIBUTESOURCEADVISOR(defaultWeBsessionManager SecurityManager){AuthisticatiativeSattributesOurCeadVisor adv = new AutherizationAttributeSourCeadVisor(); Adv.SetseCurityManager(SecurityManager); return adv; } @bean public defaultwebsecuritymanager securitymanager(defaultwebsessionmanager sessionmanager、shirodbrealm myshirorealm){defaultwebsecuritymanager securitymanager = new defaultwebsecuritymanager(); // Realmを設定します。 SecurityManager.setRealm(myshirorealm); SecurityManager.SetsessionManager(SessionManager); Return SecurityManager; } /***認証レルム; (ここでSystemUserServiceをカスタムShirodbrealm Initialization) * * @return */ @bean public shirodbrealm myshirorealm(){shirodbrealm myshirorealm = new Shirodbrealm(SystemUserService); myshirorealmを返します。 } @bean public defaultwebsessionmanager sessionmanager(shirosessiondao shirosessiondao){defaultwebsessionmanager sessionmanager = new DefaultWebsessionManager(); sessionmanager.setglobalsessessimeout(1800000L); sessionmanager.setdeleteinvalidsessions(true); sessionManager.SetsessionValidationSchedulerEnabled(true); sessionmanager.setsessiondao(shirosessiondao); sessionmanager.setsessionIdcookieEnabled(true); SimpleCookie Cookie = new SimpleCookie(shirohttpsession.default_session_id_name); cookie.sethttponly(true); cookie.setmaxage(1800000); SESSIONMANAGER.SESSESSIONIDCOOKIE(Cookie); Return SessionManager; } @bean public shirosessiondao shirosessiondao(mongodbssessionRepository shirosessionRepository){shirosessiondao dao = new shirosessiondao(); dao.setshirosessionRepository(shirosessionrepository); DAOを返します。 } @bean mongodbsessionRepository shirosessionRepository(){mongodbsessionRepository resp = new mongodbsessionRepository(mongotemplate); RETURN REST; }}タスクは完了します。これは単なる構成です。コードは抜粋され、プロジェクトから変更されました。コントローラーで使用する方法と、さまざまなアクセス許可で認証する方法については、独自のコードに実装するだけで十分です。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。