مقدمة
شيرو هو إطار إذن. للاستخدام المحدد ، يمكنك التحقق من موقع الويب الرسمي http://shiro.apache.org/. يوفر مصادقة الإذن ووظائف تسجيل الدخول مريحة للغاية.
كإطار مفتوح المصدر ، يجب أن يوفر Springboot وظائف تتكامل مع Shiro!
تم استخدام Shiro في مصادقة المشروع من قبل. يتم استخدامه بشكل متكرر في الربيع MVC ، ويتم تكوينه باستخدام XML. إنه بسيط نسبيًا وناضجًا لاستخدام Shiro للتحكم في الإذن. علاوة على ذلك ، لطالما وضعت جلسة شيرو في مونغودب. هذا أكثر تمشيا مع نية التصميم الأصلية لمونغودب. في المشاريع الموزعة ، يتم استخدام MongoDB أيضًا كطبقة وسيطة ، والتي يتم استخدامها لحل مشكلة مزامنة الجلسة بسهولة في البيئات الموزعة.
منذ إصدار Springboot ، يمكن لمشروعتي استخدام Springboot بشكل أساسي ، كما أنه مناسب جدًا لاستخدام Maven للإدارة المركزية الموحدة. على الرغم من أن Springboot يوفر أيضًا مجموعة من أمان Security Framework Security Framework ، إلا أنه ليس مفيدًا نسبيًا ، لذلك لا يزال أكثر ملاءمة لاستخدام Shiro. يعد تكامل Springboot مع Shiro أبسط بكثير من Spring MVC ، على الأقل بدون مجموعة من تكوينات XML ، والتي تبدو أكثر منعشة ، لذلك سنبدأ في الاندماج بعد ذلك.
الطريقة كما يلي:
يجب أن تكون الخطوة الأولى هي إضافة تبعيات Shiro و Mongo في Maven أولاً. إصدار شيرو الذي أستخدمه
<shiro.version> 1.2.3 </shiro.version>
إضافة تبعيات:
<Rependency> <roupeD> org.apache.shiro </rougiD> <StifactId> shiro-core </shintifactid> <sophy> $ {shiro.version} </version> </sependency> <redency> <roupiD> org.apache.shiro </groupid> <sophy> $ {shiro.version} </version> </sependency> <redency> <roupiD> org.apache.shiro </groupId> <StifactId> shiro-spring </stifactid> <splect> $ {shiro.version} </version> <sperency> <sperencid> أو groupached> <StifactId> shiro-spring </stifactid> <soph> $ {shiro.version} </version> </deperency> <redence> <roupled> org.mongodb </groupid> </intifactid> mongo-java-driver </attifactid> <roupl> org.springframework.data </groupId> <StifactId> spring-data-mongodb </attifactid> <splection> 1.7.0.release </version> </redency>ثم تكوين mongoDB في application.xml أو YML
spring.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
بعد الانتهاء من التكوين ، نبدأ في كتابة رمز مصادقة Shiro رسميًا ، أولاً تخصيص عالم المصادقة ، ويرثون من التصريح RealM
الطبقة العامة shirodbrealm يمتد التصريح { / *** عملية معلومات المستخدم* / private SystemUserService SystemUserservice ؛ Public Shirodbrealm () {} shirodbrealm العامة (SystemUserservice SystemUserservice) {this.systemuserservice = SystemUserservice ؛ } / *** معلومات التفويض* / Override OutlizationInfo dogetAuthorizationInfo (PrincialCollection Princialals) {simpleauthorizationinfo info = (simpleauthorizationinfo) shirokit.getshirosessionattr ("perms") ؛ if (null! = info &&! collectionUtils.isempty (info.getRoles ()) &&! collectionUtils.isempty (info.getStringPerMissions ())) {return info ؛ } إرجاع فارغ ؛ } / *** معلومات المصادقة* / المصادقة المحمية antainfo doggetAuthenticationInfo (antensicationToken AuthCtoken) يلقي AuthenticationException {usernamepasswordtoken token = (usernamePasswordtoken) Authctoken ؛ username = token.getUserName () ؛ if (username! = null &&! " key.setLoginName (token.getUserName ()) ؛ key.setPassword (string.valueof (token.getPassword ())) ؛ مستخدم SystemUser = SystemUserservice.login (المفتاح) ؛ if (user! = null) {tource usertemp = securityUtils.getSubject () ؛ USERTMEM.GETSESSINT (). Usertemp.getSession (). إرجاع SimpleAuthenticationInfo (user.getLoginName () ، user.getPassword () ، getName ()) ؛ }} الإرجاع null ؛ }}تخزين جلسة في مستودع وتنفيذ MongoDB:
الواجهة العامة shirosessionRepository { / ** * * param الجلسة * / void savesession (جلسة الجلسة) ؛ ......}mongodbsessionRepository.java
الطبقة العامة mongodbsessionRepository تنفذ shirosessionRepository {private mongotemplate mongotemplate ؛ mongodbsessessionRepository () {} mongodbsessionRepository العامة (mongotemplate mongotemplate) {this.mongotemplate = mongotemplate ؛ } Override public void saveSession (جلسة الجلسة) {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 (بين) ؛ } ......}shirosessiondao.java
الطبقة العامة shirosessiondao يمتد الملخصات { / *** logger* / private static logger log = loggerfactory.getLogger (shirosessiondao.class) ؛ / *** تخزين قاعدة البيانات*/ shirosessionRepository shirosessionRepository ؛ / ** * return */ public shirosessionRepository getShirosessionRepository () {return shirosessionRepository ؛ } / ** * * param shirosessionRepository * / public void setShirosessionRepository (shirosessionRepository shirosessionRepository) {this.shirosessionRepository = shirosessionRepository ؛ } Override Public Void Update (جلسة الجلسة) يلقي UnhownsessionException {getShirosessionRepository (). addatesession (الجلسة) ؛ } Override public void delete (جلسة الجلسة) {if (session == null) {log.error ("Session لا يمكن أن تكون فارغة ، حذف الفشل") ؛ يعود؛ } idileizable id = session.getId () ؛ if (id! = null) {getShirosessionRepository (). deletesession (id) ؛ }} Override Public Collection <Session> GetActiptessions () {return getShirosessionRepository (). getAllSessions () ؛ } override محمية deckreate (جلسة الجلسة) {serializable SessionId = this.generatesessionId (الجلسة) ؛ this.assignsessionId (جلسة ، SessionId) ؛ getShirosessionRepository (). SaveSession (جلسة) ؛ عودة SessionId } Override Session Doreadsession (Serializable SessionId) {return getShirosessionRepository (). getessession (SessionId) ؛ }}نعم! تم الانتهاء من جميع الفئات الأساسية ، وأخيراً اكتب تكوينًا لتهيئة وتكوين Shiro
ConfigurationPublic class shiroconfig {resource private mongotemplate mongotemplate ؛ Resource Private SystemUserService SystemUserservice ؛ // هذه هي الخدمة المستخدمة لتحديد اسم المستخدم وكلمة المرور العامة shirofilterfactorybean shirofilter (DefaultWebsCurityManager SecurityManager) {Shirofilterfactorybean shirofilterfactorybean = new ShirofiLterfactorian () ؛ Shirofilterfactorybean.SetSecurityManager (SecurityManager) ؛ shirofilterfactorybean.setLoginurl ("/login") ؛ shirofilterfactorybean.setsuccessurl ("/index") ؛ shirofilterfactorybean.setunauthorizedurl ("/403") ؛ // اعتراض. خريطة <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 ؛ } EantarizationAttributesourCeadVisor OfferationAttributesourCeadVisor (DefaultWebSessionManager SecurityManager) {efurnizationAtributesourCeadvisor Adv = New AuthorizationArbutesourCeadVisor () ؛ Adv.SetSecurityManager (SecurityManager) ؛ العودة adv } Bean Public DefaultWebsCurityManager SecurityManager (DefaultWebsessionManager SessionManager ، Shirodbrealm MyShirorealm) {defaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager () ؛ // تعيين عالم. SecurityManager.setRealm (myshirorealm) ؛ SecurityManager.SetSessionManager (SessionManager) ؛ Return SecurityManager ؛ } /*** عالم المصادقة ؛ (هنا تمرير SystemUserservice إلى تهيئة shirodbrealm المخصصة) * * return */ bean public shirodbrealm myshirorealm () {shirodbrealm myshirorealm = new shirodbrealm (systemuserservice) ؛ إعادة myshirorealm. } bean public defaultWebsessionManager SessionManager (shirosessiondao shirosessiondao) {defaultWebsessionManager SessionManager = New DefaultWebsessionManager () ؛ SessionManager.SetGlobalsessiontimeOut (1800000L) ؛ SessionManager.setDeleteInvalidsessions (True) ؛ SessionManager.SetSessionValidationsChedulerEnabled (True) ؛ SessionManager.setsessiondao (Shirosessiondao) ؛ SessionManager.SetsessionIdCookieNabled (True) ؛ simpleCookie Cookie = جديد SimpleCookie (shirohttpsession.default_session_id_name) ؛ cookie.sethttponly (صحيح) ؛ cookie.setMaxage (1800000) ؛ SessionManager.SetsessionIdcookie (ملف تعريف الارتباط) ؛ إرجاع SessionManager ؛ } bean public shirosessiondao shirosessiondao (mongodbsessionRepository shirosessionRepository) {shirosessiondao dao = new Shirosessiondao () ؛ dao.setshirosessionRepository (shirosessionRepository) ؛ إرجاع داو. } bean mongodbsessionRepository shirosessionRepository () {mongodbsessionRepository resp = new mongodbsessionRepository (mongotemplate) ؛ العودة resp }}تتم المهمة. هذا مجرد تكوين بسيط. تم اقتباس الكود وتعديله من المشروع. أما بالنسبة لكيفية استخدامه في وحدة التحكم وكيفية المصادقة بأذونات مختلفة ، فإنه يكفي تنفيذه في الكود الخاص بك.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.