الأمن في كل مكان. لقد استفدت من العطلة لقراءة مستندات Shiro وتوثيق تكامل Shiro لـ Spring Boot للتحكم في حقوق الوصول بناءً على أدوار في قاعدة البيانات
مقدمة
Apache Shiro هو إطار أمان قوي ومرن ومفتوح المصدر. إنه يتعامل مع المصادقة ، والترخيص ، وإدارة جلسة المؤسسة والتشفير بشكل نظيف.
تُظهر الصورة أعلاه الهندسة المعمارية الأساسية لشيرو
المصادقة
يُطلق عليه أحيانًا "تسجيل الدخول" لإثبات أن المستخدم هو المستخدم نفسه
إذن
عملية التحكم في الوصول ، أي تحديد "من" يصل إلى "ماذا"
إدارة الجلسة
إدارة الجلسات الخاصة بالمستخدم. في شيرو ، يمكنك أن تجد أن جميع معلومات جلسة المستخدم سيتم التحكم فيها بواسطة Shiro.
التشفير (التشفير)
خوارزميات التشفير على مصادر البيانات مع ضمان سهولة الاستخدام
يبدأ
بيئة
SPRING BOOT 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data JPA Lombok
إضافة التبعيات
فقط تبعيات شيرو الرئيسية التي يتم تقديمها هنا
<Rependency> <roupeD> org.apache.shiro </rougeid> <StifactId> shiro-spring-boot-starter </shintifactid> <الإصدار> 1.4.0-rc2 </version> </rependency>
إعدادات
نحتاج فقط إلى جدول المستخدم وجدول الدور في الوقت الحالي. سيقوم تعديل ملف التكوين في SPRING BOOT تلقائيًا بإنشاء جدول قاعدة بيانات لنا
الخادم: المنفذ: 88888SPRING: DataSource: اسم برنامج التشغيل: com.mysql.jdbc.driver اسم المستخدم: الجذر كلمة المرور: url الجذر: jdbc: mysql: // localhost: 3306/shiro؟
كيان
دور. جافا
@data @entitypublic class or {idgeneratedValue private integer id ؛ معرف مستخدم طويل خاص ؛ دور سلسلة خاصة ؛}user.java
@data @entitypublic class user {idgeneratedValue private long id ؛ اسم المستخدم الخاص بالسلسلة الخاصة ؛ كلمة مرور السلسلة الخاصة ؛}عالم
أولاً ، قم بإنشاء فئة المجال ، ويرث من التصريح ، وتخصيص أساليب التفويض والتوثيق لدينا. Realm هو مكون يمكنه الوصول إلى بيانات الأمان الخاصة بالتطبيق ، مثل المستخدمين والأدوار والأذونات.
RealM.Java
يمتد Realm للطبقة العامة ExulectRealm {Autowired Private Userservice uservice ؛ // Outhitized Override OudalizationInfo doggetAuthorizationInfo (princialCollection princialCollection) {// الحصول على اسم المستخدم من username username username = (سلسلة) SecurityUtIls.getSubject (). getPrincipal () ؛ // كائن مستخدم الاستعلام استنادًا إلى مستخدم اسم المستخدم = uservicevice.getuserByUserName (اسم المستخدم) ؛ // Query الأدوار التي تملكها قائمة المستخدم <row> list = roleservice.findbyuserId (user.getId ()) ؛ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo () ؛ لـ (دور الدور: قائمة) {// إعطاء دور المستخدم info.addStringPermission (rob.getRole ()) ؛ } معلومات الإرجاع ؛ }. // العثور على مستخدم من مستخدم قاعدة البيانات = userService.getuserByUserName (اسم المستخدم) ؛ if (userservice.getUserByUsername (اسم المستخدم) == null) {رمي جديد غير معروف actwarcountexception ("لم يتم العثور على معلومات المستخدم المقابلة في هذا النظام.") ؛ } info simpleauthenticationinfo = new SimpleAuthenticationInfo (user.getUserName () ، user.getPassword () ، getName ()) ؛ معلومات العودة ؛ }}فئة التكوين شيرو
shiroconfig.java
ConfigurationPublic class shiroconfig {bean public shirofilterfactorybean shirofilterfactorybean (SecurityManager SecurityManager) {shirofilterfactorybean shirofilterfactorybean = new Shirofilterfactorybean () ؛ Shirofilterfactorybean.SetSecurityManager (SecurityManager) ؛ خريطة <string ، string> filterChainDefinitionMap = new LinkedHashMap <string ، string> () ؛ // ما يلي هو سلسلة المرشح ، المرشح بالترتيب ، SO/** يحتاج إلى وضع مورد ثابت آخر // open filterchaindefinitionmap.put ("/favicon.ico" ، "anon") ؛ // web icon filterchaindefinitionmap.put ("/**" ، "Authc") ؛ shirofilterfactorybean.setFilterChainDefinitionMap (FilterChainDefinitionMap) ؛ إرجاع shirofilterfactorybean ؛ } bean public defaultWebSecurityManager SecurityManager () {defaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager (myrealm ()) ؛ إرجاع DefaultWebSecurityManager ؛ } bean public myRealm myRealm () {myRealm myRealm = new myRealM () ؛ العودة myrealm. }}وحدة تحكم
USERCONTROLLER.JAVA
ControllerPublic Class USERCONTROLLER {AUTOWIRED PRIVATE USERSERVICE USERSERVICE ؛ getMapping ("/") public string index () {return "index" ؛ } getMapping ("/login") public string tologin () {return "login" ؛ } getMapping ("/admin") public string admin () {return "admin" ؛ } postmapping ("/login") السلسلة العامة dologin (اسم المستخدم ، كلمة مرور السلسلة) {usernamepasswordtoken token = new usernamepasswordtoken (اسم المستخدم ، كلمة المرور) ؛ الموضوع = securityUtils.getSubject () ؛ حاول {thision.login (token) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إعادة "إعادة التوجيه: admin" ؛ } getMapping ("/home") public string home () {موضوع = securityUtils.getSubject () ؛ جرب {موضوع. checkpermission ("admin") ؛ } catch (unauletizedException issection) {system.out.println ("لا أذونات كافية") ؛ } إعادة "الصفحة الرئيسية" ؛ } getMapping ("/logout") public string logout () {return "index" ؛ }}خدمة
userService.java
servicepublic class userService {Auutowired private userDao userDao ؛ المستخدم العام getUserByUserName (string username) {return userDao.findbyuserName (اسم المستخدم) ؛ } requiresRoles ("admin") public void send () {system.out.println ("لدي الآن مسؤول الدور ، ويمكنه تنفيذ هذا البيان") ؛ }}عرض الطبقة
admin.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <head> <meta charset = "utf-8"/> <title> العنوان </head> <body> <torm> name = "username" /> <input type = "password" name = "password" /> <input type = "submit" value = "login" /> < /form> </body> </html>
home.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> title> title> </head> <////html>
index.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> title> title> </head> في </a> </body> </html>
login.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <head> <meta charset = "utf-8"/> <title> العنوان </head> <body> <torm> name = "username" /> <input type = "password" name = "password" /> <input type = "submit" value = "login" /> < /form> </body> </html>
لخص
تنفذ هذه الحالة الصغيرة عن التحكم في وصول المستخدم بناءً على الأدوار ، وأهمها عالم ، والذي يعمل كـ "جسر" أو "موصل" بين شيرو وبيانات أمان التطبيق.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.