Apache Shiro هو إطار أمان مفتوح المصدر قوي ومرن يتعامل مع عمليات التحكم في الأمان الشائعة في التطبيقات على مستوى المؤسسات مثل المصادقة ، والترخيص ، وإدارة الجلسة ، والتشفير على مستوى دقيق. الهدف الأساسي من Apache Shiro هو سهولة الاستخدام والتفاهم. في بعض الأحيان ، قد تكون التحكم في عملية الأمان معقدة للغاية ، وهو صداع للمطورين ، لكنه لا يعني ذلك بالضرورة. يجب أن تخفي الأطر التعقيد قدر الإمكان وأن تكشف واجهة برمجة تطبيقات موجزة وبديهية ، وبالتالي تبسيط عمل المطورين وضمان أمان تطبيقهم. هذه المرة سوف نتحدث عن كيفية استخدام Shiro لتنفيذ التحكم في الإذن في تطبيقات الويب الربيعية.
وظيفة
Apache Shiro هو إطار أمان شامل للتطبيق مع العديد من الميزات. يوضح الشكل التالي أهم الوظائف في شيرو:
الأهداف الرئيسية لشيرو هي "أربعة حجر الأساس لأمن التطبيق" - المصادقة ، التفويض ، إدارة الجلسة والتشفير:
بنيان
من منظور شمولي ، لدى الهندسة المعمارية لشيرو ثلاثة مفاهيم رئيسية: الموضوع (موضوع ، مستخدم) ، مدير الأمان (مدير الأمان) والعوالم (المجال). يصف الشكل التالي العلاقة بين هذه المكونات:
يمكن فهم هذه المكونات على النحو التالي:
إعداد البيانات
في تطبيقات الويب ، يكون التحكم الرئيسي في الأمان هو الأدوار والموارد والأذونات (ما الدور الذي يمكن أن يصل إلى الموارد). يمكن للمستخدم أن يكون له أدوار متعددة ، ويمكن للدور أيضًا الوصول إلى موارد متعددة ، أي يمكن أن يتوافق الدور مع أذونات متعددة. لتنفيذ تصميم قاعدة البيانات ، نحتاج إلى إنشاء ما لا يقل عن 5 جداول: جدول المستخدم ، جدول الدور ، جدول الموارد ، جدول موارد الأدوار ، جدول دور المستخدم. هيكل هذه الجداول الخمسة كما يلي:
جدول المستخدم:
| بطاقة تعريف | اسم المستخدم | كلمة المرور |
|---|---|---|
| 1 | تشانغ سان | 123456 |
| 2 | لي سي | 6666666 |
| 3 | وانغ وو | 000000 |
قائمة الأدوار:
| بطاقة تعريف | Rolename |
|---|---|
| 1 | المسؤول |
| 2 | مدير |
| 3 | طاقم عمل |
جدول الموارد:
| بطاقة تعريف | Resname |
|---|---|
| 1 | /المستخدم/إضافة |
| 2 | /المستخدم/حذف |
| 3 | /compony/info |
جدول موارد الأدوار:
| بطاقة تعريف | دور | بقايا |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
جدول دور المستخدم:
| بطاقة تعريف | userId | دور |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
فئة POJO المقابلة هي كما يلي:
/*** user*/public class user {private integer id ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ كلمة مرور السلسلة الخاصة ؛ // getter & setter ...} /*** دور*/دور الطبقة العامة {private string id ؛ سلسلة خاصة rolename ؛} /*** Resource*/Public Class Resource {Private String ID ؛ سلسلة خاصة Resname ؛} /*** ROL-RESOURCE*/Public Class Roleres {private String ID ؛ سلسلة خاصة ؛ بقايا السلسلة الخاصة ؛} /*** user-rulle*/public class userrole {private string id ؛ سلسلة userId الخاصة ؛ سلسلة خاصة دور ؛} للحصول على خطوات مفصلة لدمج Spring و Shiro ، يرجى الرجوع إلى مدونتي "دمج Apache Shiro في تطبيقات الربيع". نضيف هنا: تحتاج إلى تقديم تبعيات Shiro مقدمًا ، ومفتوحة mvnrepository.com ، والبحث عن Shiro. نحتاج إلى التبعيات الثلاثة الأولى ، وهي Shiro-Core و Shiro-Web و Shiro-Spring. مع أخذ مشروع Maven كمثال ، أضف التبعيات التالية ضمن عقدة <dependencies> في pom.xml :
<Rependency> <roupeD> org.apache.shiro </rougiD> <StifactId> shiro-core </artifactId> <sophy> 1.4.0 </version> </repremency> <reperency> <rougid> org.apache.shiro </groupid> <roupl> org.apache.shiro </rougiD> <StifactId> shiro-spring </stifactid> <الإصدار> 1.4.0 </version> </premined>
في application-context.xml تحتاج إلى تكوين حبة shiroFilter مثل هذا:
<!-تكوين فئة مصنع مرشح Shiro ، يجب أن يكون id-shirofilter متسقًا مع المرشحات التي قمنا بتكوينها في web.xml-> <bean id = "shirofilter"> <property name = "securitymanager" ref = "securitymanager"/> <! name = "suctionurl" value = "/index"/> <!-الوصول غير القانوني إلى الصفحات القفز-> <property name = "unauntorizedurl" value = "/403"/> <!-configression configuration-> <property name = "filterchaindefinitions"> <! الموارد التي تم تجاهلها أعلاه ، يجب مصادقة جميع الموارد الأخرى قبل الوصول إليها ->/** = AUTHC </value> </sopperation> </ban>
بعد ذلك ، تحتاج إلى تحديد عالم. تم دمج عالم مخصص من فئة AuthorizingRealm :
الطبقة العامة MyRealm يمتد OuplizingRealm {Autowired Private Userservice userService ؛ / *** إذن التحقق*/ Override OutlizationInfo dogetAuthorizationInfo (princialCollection princialCollection) {string loginname = securityUtils.getSubject (). getPrincipal (). tostring () ؛ if (loginName! = null) {string userId = securityUtils.getSubject (). getSession (). getAttribute ("useressessionid"). toString () ؛ // كائن معلومات الإذن ، المستخدم لتخزين جميع أدوار وأذونات المستخدم SimpleAuthorizationInfo info = جديد SimpleAuthorizationInfo () ؛ // جمع دور المستخدم shirouser shirouser = (shirouser) princialcollection.getPrimaryPrincipal () ؛ info.setRoles (shirouser.getRoles ()) ؛ info.addStringPermissions (shirouser.geturlset ()) ؛ معلومات العودة ؛ } إرجاع فارغ ؛ } / ** * وظيفة رد الاتصال المصادقة ، اتصل * / مصادقة محمية antainfo doggetauthenticationinfo (antrugenticationtoken token) {String username = (string) token.getPrincipal () ؛ مستخدم المستخدم = مستخدم جديد () ؛ sysuser.setusername (اسم المستخدم) ؛ جرب {list <SysUser> users = userService.FindByNames (user) ؛ قائمة <Tring> rolelist = userService.SelectrolenAmelistbyuserId (users.get (0) .getId ()) ؛ if (user.size ()! = 0) {String pwd = user.get (0) .getPassword () ؛ // بعد تمرير جميع عمليات التحقق ، ضع معلومات المستخدم في جلسة الجلسة = SecurityUtils.getSubject (). getSession () ؛ Session.setAttribute ("useressession" ، user.get (0)) ؛ Session.setAttribute ("useressessionId" ، user.get (0) .getID ()) ؛ Session.setAttribute ("userroles" ، org.apache.commons.lang.stringutils.join (Rolelist ، "،")) ؛ إرجاع SimpleAuthenticationInfo جديد (اسم المستخدم ، المستخدمين (0) .gappassword ()) ؛ } آخر {// لم يتم العثور على المستخدم رمي جديد غير معروف accountexception () ؛ }} catch (استثناء e) {system.out.println (e.getMessage ()) ؛ } إرجاع فارغ ؛ } /*** قم بتحديث ذاكرة التخزين المؤقت لمعلومات ترخيص المستخدم. */ public void clearcachedauthorizationInfo (principalCollection princialals) {super.clearcachedauthorizationInfo (charalals) ؛ } /*** قم بتحديث ذاكرة التخزين المؤقت لمعلومات المستخدم. */ public void clearcachedauthenticationinfo (principalcollection princalals) {super.clearcachedauthenticationinfo (strainalals) ؛ } /*** قم بمسح ذاكرة التخزين المؤقت لمعلومات ترخيص المستخدم. */ public void clearallcachedauthorizationInfo () {getAuthorizationCache (). clear () ؛ } /*** قم بمسح ذاكرة التخزين المؤقت لمعلومات المستخدم. */ public void clearallcachedauthenticationinfo () {getAuthenticationCache (). clear () ؛ } / *** قم بمسح جميع ذاكرة التخزين المؤقت* / public void clearCache (principalCollection princalals) {super.clearcache (strainalals) ؛ } / *: clearallcachedauthorizationInfo () ؛ }}أخيرًا ، حدد وحدة تحكم لتسجيل الدخول إلى المستخدم لقبول طلبات تسجيل الدخول إلى المستخدم:
controllerpublic class USERCONTROLLER {/*** تسجيل الدخول إلى المستخدم*/postMapping ("/login") تسجيل الدخول إلى السلسلة العامة (مستخدم مستخدم @valid ، bindingresult bindingresult ، redirectattributes redirectatributes) {try {if (pindingresult.haserrors ()) {return "login" ؛ } // استخدم أداة الإذن للمصادقة ، بعد تسجيل الدخول بنجاح ، القفز إلى النجاح المحدد في shirofilter Bean SecurityUtils.getSubject (). تسجيل الدخول (جديد usernamePasswordoken (user.getusername () ، user.gappassword ())) ؛ إرجاع "إعادة التوجيه: الفهرس" ؛ } catch (AuthenticationException e) {redirectattributes.addflashAttribute ("message" ، "error username أو كلمة المرور") ؛ إرجاع "إعادة التوجيه: تسجيل الدخول" ؛ }}/*** logout*/getMapping ("/logout") تسجيل السلسلة العامة (redirectattributes redirectattributes) {securityUtils.getSubject (). logout () ؛ إرجاع "إعادة التوجيه: تسجيل الدخول" ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.