أساسيات الأمن الينبصي
في المقالة السابقة ، "الاستخدام الأساسي لأمن Springboot + Spring Security وتكوين تسجيل الدخول الشخصي" ، تم تقديم SpringSecurity لفترة وجيزة ، وإدخال الواجهة بشكل أساسي وتطبيق الوظائف. تحاول هذه المقالة إجراء تحليل بسيط لعملية مصادقة المستخدم من منظور رمز المصدر.
قبل تحليل محدد ، يمكننا أولاً إلقاء نظرة على المبادئ العامة لـ Springsecurity:
أساسيات الأمن الينبصي
في الواقع ، يكون الأمر بسيطًا نسبيًا ، بشكل أساسي من خلال سلسلة من المرشحات لاعتراض الطلب ومعالجته.
وصف عملية معالجة الشهادات
دعونا نلقي نظرة على فئة UsernamePasswordAuthenticationFilter مباشرة.
الطبقة العامة usernamepasswordauthenticationfilter يمتد ملخصية uTreasicationProcessingFilter // تسجيل الدخول لطلب المصادقة المصادقة على محاولة الصعود العامة (httpservletrequest طلب ، httpservletprosn استجابة). antavinicationserviceException ("طريقة المصادقة غير مدعومة:" + request.getMethod ()) ؛ } آخر {// احصل على المستخدم ، سلسلة كلمة المرور username = this.ObaintUserName (request) ؛ سلسلة كلمة مرور = this.obtainpassword (request) ؛ if (username == null) {username = "" ؛ } if (password == null) {password = "" ؛ } username = username.trim () ؛ // إنشاء الرمز المميز ، usernamepasswordauthenticationtoken authRequest = جديد usernamePasswordauthenticationToken (اسم المستخدم ، كلمة المرور) ؛ this.setDetails (طلب ، authRequest) ؛ // التحقق من إرجاع هذا. }}} في طريقة attemptAuthentication ، فإن الشيء الرئيسي هو الحصول على قيم طلب اسم المستخدم وكلمة المرور ، ثم إنشاء كائن usernamePasswordauthenticationToken لمزيد من التحقق.
ولكن يمكننا أولاً إلقاء نظرة على طريقة بناء UsernamePasswordauthenticationToken
public usernamepasswordauthenticationToken (كائن رئيسي ، بيانات اعتماد الكائن) {// قم بتعيين إذن فارغ Super ((collection) null) ؛ this.principal = المدير ؛ this.credentials = بيانات الاعتماد ؛ // تعيين ما إذا كان هذا. في الواقع ، ورثت usernamepasswordauthenticationtoken من Authentication . تم ذكر هذا الكائن في المقالة السابقة. إنها معلمة في طريقة رد الاتصال الناجحة لتسجيل الدخول ، والتي تحتوي على معلمات مثل معلومات المستخدم ، ومعلومات الطلب ، إلخ.
لذلك دعونا نرى
this.getAuthenticationManager (). المصادقة (authRequest) ؛
هناك رجل مصادقة هنا ، لكن المكالمة الحقيقية هي ProviderManager .
الطبقة العامة providermanager تنفذ المصادقة ، messagesourceaware ، initializingBean {مصادقة المصادقة العامة (مصادقة المصادقة) يلقي المصادقة {class <؟ يمتد المصادقة> totest = Authentication.getClass () ؛ AuthenticationException lastException = null ؛ نتيجة المصادقة = فارغة ؛ Boolean Debug = logger.isdebugenabled () ؛ iterator var6 = this.getProviders (). iterator () ؛ بينما (var6.hasnext ()) {anteengicprovider provider = (antainticationProvider) var6.next () ؛ // 1. }}} مصادقة المصادقة العامة (مصادقة المصادقة) يلقي AuthenticationException {userDetails user = this.usercache.getuserFromCache (اسم المستخدم) ؛ if (user == null) {cachewasused = false ؛ // 1. انتقل للحصول على مستخدم userDetails = this.retrieveUser (اسم المستخدم ، (usernamePasswordauthenticationToken) مصادقة) ؛ } حاول {// 2. // 3. فحص إضافي (كلمة مرور تحقق) this.additionalauthenticationChes (المستخدم ، (usernamePasswordauthenticationToken) مصادقة) ؛ } catch (AuthenticationException var7) {} // 4. // 5. إرجاع المصادقة المعتمدة الحقيقية إلى ذلك. يتجه الفحصان على userDetails هنا بشكل أساسي من خلال طرقه الأربعة التي تعيد نوع Boolean.
بعد التحقق من المعلومات ، يتم إرجاع المصادقة المصادقة من خلال طريقة بناء UsernamePasswordAuthenticationToken .
بعد الحصول على المصادقة المعتمدة ، سيتم استدعاء SuccessHandler مرة أخرى. أو إذا فشلت المصادقة ، اتصل بالرقم.
كيف تتم مشاركة نتائج المصادقة بين طلبات متعددة
بعد الانتهاء من عملية معالجة مصادقة المستخدم ، دعونا نفكر في كيفية مشاركة نتيجة المصادقة بين طلبات متعددة؟
نظرًا لعدم وجود تكوين لهذا ، يمكننا التفكير في الطريقة الافتراضية التي يجب أن تكون لتخزين نتيجة المصادقة في الجلسة.
إذن متى يتم تخزينه في الجلسة؟
يمكننا الاستمرار في النظر إلى الكود المصدر لعملية المصادقة. بعد تمرير طريقة المحاولة ، إذا كانت المصادقة ناجحة ، فسيتم استدعاء المصادقة الناجحة. في هذه الطريقة ، لا يسمى SuccessHandler فقط ، ولكن هناك أيضًا سطر من التعليمات البرمجية الأكثر أهمية.
SecurityContextholder.getContext (). setAuthentication (AuthResult) ؛
SecurityContextholder هو حزمة للاطلاع على ThreadLocal. ThreadLocal هو فئة تخزين البيانات داخل مؤشر ترابط. من خلال ذلك ، يمكن تخزين البيانات في مؤشر ترابط محدد. بعد تخزين البيانات ، يمكن الحصول على البيانات المخزنة فقط في مؤشر الترابط المحدد ، ولكن لا يمكن لمؤشرات الترابط الأخرى الحصول على البيانات. لمزيد من المعلومات حول مبادئ ThreadLocal ، يرجى مراجعة مقالتي السابقة.
بشكل عام ، سيتم إكمال طلبات وإرجاع نفس الواجهة في موضوع واحد. نضع AuthResult في SecurityContextholder ، ويمكننا أيضًا إخراجها في أي مكان آخر.
أخيرًا ، يتم استرداد AuthResult من SecurityContextPersistenceFilter ويتم تخزين الجلسة.
SecurityContextPersistenceFilter هو أيضًا مرشح ، وهو في طليعة سلسلة مرشحات الأمان بأكملها ، مما يعني أن المرشح قد تم تمريره لأول مرة عند بدء التحقق ، ويتم تمرير التمريرة الأخيرة أخيرًا بعد اكتمال التحقق.
الحصول على معلومات المستخدم المصادقة
/*** احصل على تسجيل مستخدم حاليًا* @Regurn مصادقة كاملة*/ @getMapping ("/me1") الكائن العام currentUser () {return securityContexTholder.getContext (). */@getMapping ("/me3") كائن عام cuurentuser (AuthenticationPrincipal userDetails userDetails) {return userDetails ؛}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.