شيرو
Apache Shiro هو إطار مصادقة وخفيفة الوزن. بالمقارنة مع أمن الربيع ، فهو بسيط وسهل الاستخدام وله مرونة عالية. يوفر Springboot نفسه الدعم للأمان ، بعد كل شيء ، إنه شيء خاص به. لا يدمج Springboot Shiro في الوقت الحالي ، لذلك عليك أن تتطابق معها بنفسك.
1. إضافة التبعيات
<Rependency> <roupeD> org.apache.shiro </rougiD> <StifactId> shiro-spring </artifactid> <sophy> 1.2.5 </splements> </sependency> <redency> <roupiD> org.apache.shiro </rougeid>
2. اكتب فئة تكوين شيرو
حزمة com.xbz.web.system.config ؛ استيراد at.pollux.thymeleaf.shiro.dialect.shirodialect ؛ استيراد org.apache.shiro.authc.credential.credentialSmatcher ؛ استيراد org.apache.shiro.authc.credential.HashedCredentialSmatcher ؛ استيراد org.apache.shiro.cache.ehcache.ehcachemanager ؛ استيراد org.apache.shiro.codec.base64 ؛ استيراد 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.lifecyclebeanpostprocessor ؛ استيراد org.apache.shiro.spring.security.Interceptor.AuthorizationAtributesourCeadVisor ؛ استيراد org.apache.shiro.spring.web.shirofilterfactorybean ؛ استيراد org.apache.shiro.web.mgt.cookierememblememanager ؛ استيراد org.apache.shiro.web.mgt.defaultwebsecurityManager ؛ استيراد org.apache.shiro.web.servlet.simplecookie ؛ استيراد org.apache.shiro.web.session.mgt.defaultWebsessionAnager ؛ استيراد org.springframework.aop.framework.autoproxy.defaultAdvisorautoproxyCreator ؛ استيراد 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* Apacheshiro Core تنفذ التحكم في الإذن والاعتراض من خلال المرشح ، تمامًا مثل SpringMVC يستخدم dispachservlet للتحكم في توزيع الطلب. * نظرًا لأنه يستخدم مرشحًا ، أي التصفية والتحقق من الإذن من خلال قواعد عنوان URL ، نحتاج إلى تحديد سلسلة من القواعد وحقوق الوصول حول عناوين URL* / configuration shiroconfiguration { / *** DefaultAdvisoraUproxycreator ، فاصوليا من الربيع ، ويقرر الدافع عن الطبقات لطرق المسئولية. */ @beanconditionalonmissingbean public defaultAdvisorautOproxyCreator defaultAdvisorautOproxyCreator () {defaultAdvisorautOproxyCreator defaultaap = new DefaultAdvisorautoproxyCreator () ؛ defaultaap.setproxytargetClass (true) ؛ إرجاع defaultaap ؛ } /*** shirofilterfactorybean: من أجل إنشاء shirofilter ، التعامل مع ملفات اعتراض الموارد. * يحافظ بشكل أساسي على ثلاثة عناصر من البيانات ، SecurityManager ، المرشحات ، FilterChainDefinitionManager. * ملاحظة: تكوين shirofilterfactorybean واحد هو أو تقارير خطأ ، لأنه عند تهيئة shirofilterfactorybean ، من الضروري الحقن: SecurityManager * * filterchain تعريف الوصف * 1. Perms ، الأدوار * */ bean public Shirofilterfactorybean shirofilterfactorybean () {Shirofilterfactorybean shirofilterfactorybean = new Shirofilterfactorybean () ؛ Shirofilterfactorybean.SetSecurityManager (SecurityManager ()) ؛ shirofilterfactorybean.setloginurl ("/login") ؛ // لا تعين صفحة login.jsp ضمن الدليل الجذر لمشروع الويب shirofilterfactorybean.setsuccessurl ("/index") ؛ jump/* // اعتراض مخصص ، إعدادات لمرشحات متعددة* // الخريطة <string ، filter> filters = new LinkedHashMap <> () ؛ // logoutfilter logoutFilter = new logoutFilter () ؛ // قم بحد عدد الأرقام عبر الإنترنت في نفس الحساب في نفس الوقت. أو علامة واحدة ، إلخ. // filters.put ("logout" ، null) ؛ // shirofilterfactorybean.setFilters (المرشحات) ؛ خريطة <string ، string> filterChainDefinitionMap = new LinkedHashMap <> () ؛ // يجب أن يكون FilterChainDefinitionManager عبارة عن LinkedHashMap لأنه يجب أن يضمن filterchaindefinitionmap.put ("/css/**" ، "Anon") ؛ // لا تتطلب الموارد الثابتة أذونات ، إذا كانت هناك ملفات في الدلائل الأخرى (مثل JS ، IMG ، إلخ) و FilterChainDefinitionMap.put ("/" ، "Anon") ؛ FilterChainDefinitionMap.put ("/login" ، "anon") ؛ // تكوين جزء من url filterchaindefinitionmap.put ("/logout" ، "logout") ؛ FilterChainDefinitionMap.put ("/user/**" ، "AUTHC ، ROLES [ROB_USER]") ؛ // المستخدم هو دور _user للوصول. يتحكم دور المستخدم في سلوك المستخدم. FilterChainDefinitionMap.put ("/events/**" ، "AUTHC ، ROLES [ROB_ADMIN]") ؛ // filterchaindefinitionmap.put ("/user/edit/**" ، "Authc ، perms [user: edit]") ؛ // للاختبار ، يتم إصلاح القيمة الميتة ، ويمكن أيضًا قراءتها من قاعدة البيانات أو التكوينات الأخرى. هنا ، يتم استخدام الأذونات للتحكم في filterchaindefinitionmap.put ("/**" ، "AUTHC") ؛ // الموارد التي تحتاج إلى تسجيل الدخول ، بشكل عام وضع /** في الجزء السفلي من shirofilterfactorybean.setFilterChainDefinitionMap (FilterChainDefinitionMap) ؛ إرجاع shirofilterfactorybean ؛ }. /** إدارة كائن ملفات تعريف الارتباط*/public simplecookie remergenmeCookie () {// هذه المعلمة هي اسم ملف تعريف الارتباط ، المقابل لاسم مربع الاختيار في الواجهة الأمامية = تذكر SimpleCookie SimpleCookie = جديد SimpleCookie (cookie_name) ؛ SimpleCookie.setMaxage (604800) ؛ // تذكر أن ملف تعريف الارتباط الخاص بي يسري لمدة 7 أيام ، ويتم إرجاع الوحدة SimpleCookie ؛ } / ** كائن إدارة ملفات تعريف الارتباط: تذكرني وظيفة* / public CookireMemplMemanager remearmemanager () {cookierememblememanager cookierememblememanager = new Cookieremmanager () ؛ cookierememblememanager.setCookie (rememplmeCookie ()) ؛ cookierememblememanager.setcipherkey (base64.decode ("3AVVHMFLUS0KTA3KPRSDAG ==")) ؛ } bean sessiondao sessiondao () {return new MemorySessionDao () ؛ } bean public SessionManager SessionManager () {defaultWebsessionManager SessionManager = new DefaultWebsessionManager () ؛ Collection <SessionListener> المستمعين = ArrayList جديد <> () ؛ المستمعين. add (new bdsessionListener ()) ؛ SessionManager.SetsessionListeners (المستمعين) ؛ SessionManager.setsessiondao (SessionDao ()) ؛ إرجاع SessionManager ؛ } // ============================ Cookies End ======================= /endregion /*** ** إنها فئة مهمة نسبيًا. */ @bean (name = "securityManager") Public DefaultWebSecurityManager SecurityManager () {defaultWebSecurityManager SecurityManager = New DefaultWebSecurityManager () ؛ SecurityManager.setRealm (shirorealm ()) ؛ SecurityManager.setCachemanager (ehcachemanager ()) ؛ . //حقن تذكر مديري ؛ SecurityManager.setRemembleMemanager (remexmanmanager ()) ؛ Return SecurityManager ؛ } /** * shirorealm ، هذه فئة مصادقة مخصصة ، ورثت من التصريح ، * المسؤولة عن مصادقة المستخدم ومعالجة الإذن ، يمكنك الرجوع إلى تنفيذ JDBCrealM. */ @beandependson ("LifecyClebeanPostProcessor") shirorealm shirorealm (creditivesmatcher matcher) {shirorealm Realm = new Shirorealm () ؛ RealM.SetCredentialSmatcher (Matcher) ؛ // Password Perfortifice يقوم بإرجاع عالم الإرجاع ؛ } /*** ehcachemanager ، cachemanager* بعد تسجيل تسجيلات المستخدم بنجاح ، يتم تخزين معلومات المستخدم ومعلومات الإذن ، ثم في كل مرة يطلبها المستخدم في جلسة المستخدم. إذا لم يتم تعيين هذه الفول ، فسيتم الاستعلام عن قاعدة البيانات مرة واحدة لكل طلب. */ @beandependson ("LifecyClebeanPostProcessor") public ehcachemanager ehcachemanager () {ehcachemanager em = new ehcachemanager () ؛ EM.SetCachemanagerConfigfile ("classpath: config/ehcache.xml") ؛ // مسار ملف التكوين إرجاع em ؛ } /** * LifecyClebeanPostProcessor ، هذه فئة فرعية من DestructionAwareBeanPostProcessor ، * مسؤولة عن دورة حياة org.apache.shiro.util.initializable. * هي أساسا فئة فرعية من فئة التصريح ، وكذلك فئة ehcachemanager. */ bean (name = "LifecyClebeanPostProcessor") Public LifeCycleBeanPostProcessor LifeCycleBeanPostProcessor () {Return New LifecyCleBeanPostProcessor () ؛ } /** * hashedcredentialsMatcher ، هذه الفئة مخصصة لترميز كلمة المرور ، * منع تخزين كلمات المرور في قاعدة البيانات بوضوح. بالطبع ، عند تسجيل الدخول إلى المصادقة ، * هذه الفئة مسؤولة أيضًا عن ترميز كلمات المرور التي تم إدخالها في المعالجة * معالجة معالجة معالجة مطابقة المصادقة: إذا كان التخصيص يتطلب من ميراث hashedentilessmatcher */ @bean (name = "hashedcredentialsmatcher") public. بيانات الاعتماد = new hashedcredentialsmatcher () ؛ بيانات الاعتماد. عندما يسجل المستخدم أكثر من خمسة أخطاء تسجيل الدخول ، يتم قفل المستخدم. يُمنع المستخدم من محاولة تسجيل الدخول إلى بيانات الاعتماد. CreditiveSmatcher.setStoredCredentialShexExencoded (True) ؛ إرجاع بيانات الاعتماد. } /** * AuthorizationAttributesourCeadVisor ، فئة المستشارين المنفذة في Shiro ، * تستخدم AopallianCeannotationsAuthorizationMethodInterceptor داخليًا لاعتراض الأساليب مع التعليقات التعليقات التالية. */ bean publicizationArtributesourCeadVisor OfferationAttributesourCeadVisor () {efurnizationAtributesourCeadVisor Advisor = New OutlizationArbutesourCeadVisor () ؛ Advisor.SetSecurityManager (SecurityManager ()) ؛ مستشار العودة ؛ } // bean public shirodialect shirodialect () {return new Shirodialect () ؛ }} 3. تخصيص فئة التحقق من العالم
حزمة com.yiyun.web.system.config ؛ استيراد com.yiyun.dao.master.userdao ؛ استيراد com.yiyun.domain.userdo ؛ استيراد com.yiyun.web.common.Utils.shiroutils ؛ استيراد com.yiyun.web.system.service.menuservice ؛ استيراد org.apache.shiro.securityutils ؛ استيراد org.apache.shiro.authc.*؛ استيراد org.apache.shiro.authz.AuthorizationInfo ؛ استيراد org.apache.shiro.authz.simpleAuthorizationInfo ؛ استيراد org.apache.shiro.realm.authorizingRealm ؛ استيراد org.apache.shiro.session.session ؛ استيراد org.apache.shiro.subject.principalCollection ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد java.util.*؛ / *** احصل على معلومات المستخدم والإذن*/ الطبقة العامة shirorealm يمتد التصريح {// بشكل عام ، ما هو مكتوب هنا هو servicired userdao usermapper ؛ @autowired قوائم القوائم الخاصة ؛ /*** مصادقة تسجيل الدخول بشكل عام ، بعد تسجيل الدخول ، يتم منح المستخدم الحالي أذونات. تعتمد هذه الخطوة على dogetauthenticationinfo. فقط بعد معلومات المستخدم ، يمكنك تحديد ما إذا كان سيتم تخويل المستخدم بناءً على دور المستخدم ومعلومات التفويض. لذلك ، فإن الأدوار والأذونات هنا هي أساس الحكم الرئيسي للمستخدم * param antainticationtoken * regurn * @throws antructionException */ Override AuthenticationInfo doggetauthenticationInfo (antainticationtoken antainticationtoken) يلقي مصادقة {usernamePassworkownoken token = (usernamepaswordoken) userdo user = usermapper.findbyname (token.getusername ()) ؛ سيقوم Shiro بإجراء مقارنة كلمة المرور والتحقق من الولايات المتحدة القائمة <Tole> rlist = uroledao.findrolebyuid (user.getID ()) ؛ // الحصول على قائمة دور المستخدم <Upermission> plist = upermissiondao أذونات strlist = new ArrayList <String> () ؛ /// مجموعة أذونات المستخدم لـ (ulole rol: r list) {rolestrist.add (roly.getName ()) ؛ } لـ (upermission upermission: plist) {perminsstrlist.add (upermission.getName ()) ؛ } user.setRolestrList (rolestrlist) ؛ user.setPerminsStstrlist (perminsstrlist) ؛ جلسة الجلسة = SecurityUtils.getSubject (). getSession () ؛ Session.setAttribute ("المستخدم" ، المستخدم) ؛ // إذا نجحت ، ضعه في الجلسة // إذا كان موجودًا ، قم بتخزين هذا المستخدم في معلومات مصادقة تسجيل الدخول ، ولا تحتاج إلى مقارنة كلمة المرور الخاصة بك بنفسك. سيقوم Shiro بإجراء التحقق من مقارنة كلمة المرور بالنسبة لنا. إرجاع جديد SimpleAuthenticationInfo (user ، user.getPassword () ، getName ()) ؛ } إرجاع فارغ ؛ ) أي ما يعادل (سلسلة) princialcollection.fromrealm (getName ()). iterator (). التالي () ؛ // string loginName = (String) super.getavailableprincipal (principalCollection) ؛ userdo user = (userDo) princialCollection.getPrimaryPrincipal () ؛ // // انتقل إلى قاعدة البيانات للتحقق مما إذا كان هذا الكائن موجودًا // مستخدم المستخدم = null ؛ // في المشاريع الفعلية ، يمكنك التخزين المؤقت وفقًا للموقف الفعلي. إذا لم تفعل ذلك ، فإن شيرو نفسه لديه آلية زمنية زمنية ولن يقوم بتنفيذ الطريقة بشكل متكرر خلال دقيقتين // user = usermapper.findbyName (loginname) ؛ إذا تم استخدام (user! = NULL) {// معلومات كائن معلومات الإذن ، لتخزين جميع الأدوار (الدور) والأذونات (إذن) للمستخدم الذي تم العثور عليه SimpleAuthorizationInfo info = new SimpleAuthorizationInfo () ؛ // info info info.addroles (user.getRolestrList ()) ؛ // مجموعة أذونات المستخدم info.addStringPermissions (user.getPerMinsStstrlist ()) ؛ معلومات العودة ؛ } // Return NULL ، سيؤدي ذلك إلى الوصول إلى أي مستخدم للوصول إلى الطلب المعترض للقفز تلقائيًا إلى العنوان المحدد بواسطة UnauletizedUrl ؛ }}4. أخيرًا ، ألق نظرة على ملف التكوين لـ Ehcache
<؟ <diskstore path = "java.io.tmpdir /tmp_ehcache" /> <!- الاسم: اسم ذاكرة التخزين المؤقت. MaxElementSinMemory: الحد الأقصى لعدد ذاكرة التخزين المؤقت MaxElementSondisk: الحد الأقصى لعدد ذاكرة التخزين المؤقت للقرص الثابت. الأبدي: ما إذا كان الكائن صالحًا بشكل دائم ، بمجرد تعيينه ، لن تعمل المهلة. OverflowTodisk: ما إذا كان سيتم حفظه إلى القرص ، timetoidleseconds: يحدد وقت الخمول المسموح به (الوحدة: الثواني) للكائن قبل انتهاء صلاحيته. يُستخدم فقط إذا كان الكائن الخاطئ = غير صالح بشكل دائم ، فهو سمة اختيارية ، القيمة الافتراضية هي 0 ، مما يعني أن وقت الخمول لا حصر له. TimetoLivesEconds: يحدد الوقت (الوحدة: الثواني) من الكائن قبل انتهاء صلاحيته. الحد الأقصى للوقت هو بين وقت الخلق ووقت الفشل. المستخدم فقط إذا كان الكائن الخاطئ = الخاطئ غير صالح بشكل دائم ، فإن الافتراضي هو 0. ، مما يعني أن وقت بقاء الكائن غير محدود. Diskpersenteration: ما إذا كان متجر القرص مستمر بين إعادة تشغيل الجهاز الظاهري. القيمة الافتراضية خاطئة. diskspoolbuffersizemb: هذه المعلمة تحدد حجم ذاكرة التخزين المؤقت لمستشر القرص (ذاكرة التخزين المؤقت للقرص). الافتراضي هو 30 ميجابايت. يجب أن يكون لكل ذاكرة التخزين المؤقت المخزن المؤقت الخاص بها. DiskexpiryThreadIntervalseconds: فاصل زمني لتأتير سلسلة فشل القرص ، الافتراضي هو 120 ثانية. MemoryStoreEvictionPolicy: عندما يتم الوصول إلى حد MaxElementSinMemory ، ستقوم Ehcache بتنظيف الذاكرة وفقًا للسياسة المحددة. السياسة الافتراضية هي LRU (المستخدمة مؤخرًا). يمكنك ضبطه على FIFO (الأول في ، أولاً خارج) أو LFU (أقل استخدامًا). ClearonFlush: ما إذا كان يجب مسح متى تكون كمية الذاكرة الحد الأقصى. MemoryStoreVictionPolicy: ثلاث استراتيجيات المقاصة لـ Ehcache ؛ FIFO ، أولاً في البداية ، هذا هو الأكثر دراية للجميع ، أولاً في البداية. LFU ، أقل استخدامًا ، هي الإستراتيجية المستخدمة في المثال أعلاه. لكي تكون صريحا ، وهذا يعني أنه كان أقل استخدام على الإطلاق. كما ذكر أعلاه ، فإن العنصر المخبوق له سمة ضرب ، وسيتم مسح أقل قيمة ضربات من ذاكرة التخزين المؤقت. LRU ، الأقل استخدامًا مؤخرًا ، يحتوي العنصر المخزونات على طابع زمني. عندما تكون سعة ذاكرة التخزين المؤقت ممتلئة وتحتاج إلى إفساح المجال لتخزين عناصر جديدة ، سيتم مسح العنصر الذي يعاني من أبعد وقت في عنصر ذاكرة التخزين المؤقت الحالية من ذاكرة التخزين المؤقت. -> <defaultCache eternal = "false" maxElementSinMemory = "1000" OverflowTodisk = "false" diskpersistraft = "false" timetoidleSeConds = "0" TimetOlivesEconds = "600" memoryStoreVictePolicy = "lru" />! maxentrieslocalheap = "2000" eternal = "false" timetoidleSeConds = "3600"
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.