تصنيف استخدام أمن الربيع:
أعتقد أن كل من عاش في بايدو يعرف كيفية استخدام أمن الربيع. هناك أربعة استخدامات ، من البسيطة إلى العميقة:
1. لا يتم استخدام قاعدة بيانات ، يتم كتابة جميع البيانات في ملف التكوين ، وهو أيضًا عرض تجريبي في المستند الرسمي ؛
2. استخدم قاعدة البيانات وتنفيذ تصميم الكود الافتراضي لقاعدة البيانات وفقًا لأمان Spring ، مما يعني أن قاعدة البيانات قد تم إصلاحها ، وأن هذه الطريقة غير مرنة ، وقاعدة البيانات مصممة بسيطة للغاية ولها تبرز عملية سيئة ؛
3. أمن الربيع يختلف عن ACEGI. لا يمكن تعديل المرشح الافتراضي بعد الآن ، لكنه يدعم إدراج المرشحات ، لذلك بناءً على ذلك ، يمكننا إدراج مرشحاتنا الخاصة للاستخدام بمرونة ؛
4. وسائل العنف لتعديل رمز المصدر. تعديل المرشح الافتراضي المذكور أعلاه هو فقط لتعديل ملف التكوين لاستبدال المرشح. هذا يغير بشكل مباشر الكود المصدري في الداخل ، ولكن هذا لا يتوافق مع مبدأ تصميم OO ، وليس عمليًا وغير متوفر.
تقدم هذه المقالة بشكل أساسي المحتوى ذي الصلة حول تسجيل الدخول إلى مصادقة أمن الربيع. يتم مشاركته للرجوع إليه وتعلمك. لن أقول الكثير أدناه. دعونا نلقي نظرة على المقدمة التفصيلية معًا.
1. ملخص
1.1. مقدمة
Spring Security هو إطار أمان يعتمد على مرشحات الربيع AOP و Servlet لإدارة مصادقة الإذن ، إلخ.
1.2.SPRING SECENTION عملية مصادقة مخصصة
1) عملية المصادقة
توليد antainticationTokens غير مصادفة
↑ (الحصول على معلومات) (تعيين مقدمي الخدمات وفقًا لـ AuthenticationToken) AuthenticationFilter -> المصادقة.
2) إضافة مصادقة Filter إلى سلسلة مرشح الأمان (تم تكوينها في خادم الموارد) ، مثل:
http.addfilterbefore (المصادقة Filter ، AbstractPreAuthenticatedProcessingFilter.class)
أو:
http.addfilterafter (المصادقة Filter ، usernamepasswordauthenticationfilter.class)
2. خذ تسجيل الدخول عبر الرسائل القصيرة كمثال
2.1. بيئة التنمية
2.2. تحليل الكود الأساسي
2.2.1. عملية مصادقة تسجيل الدخول المخصصة
2.2.1.1. رمز تسجيل الدخول المصادقة المخصص
/** * رمز تسجيل الدخول عبر الهاتف المحمول * * Author: Catalpaflat */فئة عامة mobileLoginAuthenticationToken يمتد AbstractAuthenticationToken {Private Static Final Long SerialVersionuid = SpringSecurityCoreversion.Serial_Version_Uid ؛ private static final logger = loggerfactory.getLogger (mobileLoginAuthenticationToken.class.getName ()) ؛ كائن نهائي خاص ؛ MobiLeloginAuthenticationToken (String Mobile) {Super (null) ؛ this.principal = mobile ؛ this.setAuthenticated (false) ؛ logger.info ("mobiLeloginAuthenticationToken setauthenticated -> تحميل كاذب ...") ؛ } MobiLeloginAuthenticationToken (كائن كائن ، المجموعة <؟ تمتد السلطات GrantedAuthority> {Super (Complesities) ؛ this.principal = المدير ؛ // يجب استخدام Super ، حيث نقوم بتجاوز super.setauthenticated (صحيح) ؛ logger.info ("mobiLeloginAuthenticationToken setauthenticated -> تحميل حقيقي ...") ؛ } Override public void setauthenticated (مصادقة منطقية) {if (anthingicated) {رمي New IllugalArgumentException ("لا يمكن تعيين هذا الرمز المميز إلى المُنشئ الموثوق به والذي يأخذ قائمة المانحين بدلاً من ذلك") ؛ } super.setAuthenticated (false) ؛ } Override public object getCredentials () {return null ؛ } Override public object getPrincipal () {return this.principal ؛ } Override public void erasecredentials () {super.erasecredentials () ؛ }} ملحوظة:
setauthenticated (): يحدد ما إذا كان قد تمت مصادقته
2.2.1.1. مرشح تسجيل الدخول المصادقة المخصص
/** * مرشح تسجيل الدخول عبر الهاتف المحمول * * Author: Catalpaflat */class public mobileLoginAuthenticationFilter يمتد الملخصات ustracticationprocessingfilter {private boolean postonly = true ؛ private static final logger = loggerfactory.getLogger (mobiLeLoginAuthenticationFilter.class.getName ()) ؛ getTerTerTer سلسلة خاصة mobileparametername ؛ MobileLoginAuthenticationFilter (سلسلة MobileLoginurl ، سلسلة mobileparametername ، سلسلة httpmethod) {super (جديد antatherquestmatcher (mobileloginurl ، httpmethod)) ؛ this.mobileparametername = mobileparametername ؛ logger.info ("mobiLeLoGinaUthenticationFilter تحميل ...") ؛ } Override المصادقة العامة المحاولات (طلب httpservletrequest ، httpservletresponse) يلقي المصادقة ، ioException ، servletexception {if (postonly &&! request.getMethod (). request.getMethod ()) ؛ } // Get Mobile String Mobile = getMobile (request) ؛ . // السماح للفئات الفرعية بتعيين خاصية "التفاصيل" setDetails (طلب ، AuthRequest) ؛ إرجاع this.getAuthenticationManager (). المصادقة (AuthRequest) ؛ } / *** تفاصيل إعداد مصادقة الهوية* / private void setDetails (طلب httpservletrequest ، mobileLoginAuthenticationToken authRequest) {authRequest.setDetails (antainticationDetailsSource.BuildDetails (request)) ؛ } / *** احصل على رقم الهاتف المحمول* / سلسلة خاصة getMobile (طلب httpservletrequest) {return request.getParameter (mobileparametername) ؛ } public void setPostonly (boolean postonly) {this.postonly = postonly ؛ }}ملاحظة: طريقة المحاولة () الطريقة:
2.2.1.1. مزود تسجيل الدخول المصادقة المخصص
/** * موفر مصادقة تسجيل الدخول عبر الهاتف المحمول * * * uthor: CatalPaflat */الفئة العامة mobiLeloginaUtengeicationProvider تنفذ AuthenticationProvider {private static final logger logger = loggerfactory.getlogger (mobileLoginaUnusticationProvider.class.getName ()) ؛ getTerTerter الخاص userDetailsService chemuSerDetailsService ؛ MobiLeloginAuthenticationProvider () {logger.info ("MobiLeloginAuthenticationProvider loading ...") ؛ } /*** المصادقة* /Override مصادقة المصادقة العامة (مصادقة المصادقة) يلقي المصادقة {// الحصول على معلومات رمزية مغلفة بواسطة مرشح mobileloginauthenticationtoken مصادقة = (mobiLeloginauthenticationToken) ؛ // احصل على معلومات المستخدم (مصادقة قاعدة البيانات) userDetails userDetails = chemuSerDetailsService.LoadUserByUsername ((string) antrugleToken.getPrincipal ()) ؛ // لم يتم تمريرها إذا (userDetails == null) {رمي internalauthenticationservicexception ("غير قادر على الحصول على معلومات المستخدم") ؛ } // by MobiLeloginaUtenticationTOKENTOKEN AuthenticationResult = New MobiLELOGINAUTHENTECATIONTOKEN (userDetails ، userDetails.getAuthorities ()) ؛ AuthenticationResult. إرجاع المصادقة. } / ** * وفقًا لنوع الرمز المميز ، حدد أي مزود يستخدم * / Override Public Boolean Supports (Class <؟> المصادقة) {return mobileLoginAuthenticationToken.Class.ISAssignable من (المصادقة) ؛ }}ملاحظة: طريقة المصادقة ()
2.2.1.1. تكوين مصادقة تسجيل الدخول المصادقة المخصص
@configuration (SpringBeannameConstant.default_custom_mobile_login_authentication_security_config_bn) الطبقة العامة mobileloginauthenticationicationsecuritycuritycurity loggerfactory.getLogger (MobiLeLoGinaUtenticationSecurityConfig.class.getName ()) ؛ value ("$ {login.mobile.url}") سلسلة خاصة defaultMobileloginurl ؛ value ("$ {login.mobile.parameter}") سلسلة خاصة defaultMobileloginParameter ؛ value ("$ {login.mobile.httpmethod}") سلسلة خاصة defaultMobileLoginHttpMethod ؛ Autowired private CustomMlConfig customyMlConfig ؛ AUTOWIRED userDetailsService chemuSerDetailsService ؛ Autowired Private AuthenticationsuccessHandler CustomAuthenticationsuccessHandler ؛ AUTOWIRED PRIVATE FUELTICATIONSFAILUREHERLER CUSTOMAUTHENTICATIONSHINGHERLERLER ؛ MobiLeLoGinaUthenticationationsCurityConfig () {logger.info ("mobiLeloginAuthenticationSecurityConfig loading ...") ؛ } override public void config (httpsecurity http) يلقي استثناء {mobilepojo mobile = customymlconfig.getlogins (). getMobile () ؛ سلسلة url = mobile.geturl () ؛ المعلمة سلسلة = mobile.getParameter (). getMobile () ؛ سلسلة httpmethod = mobile.gethttpmethod () ؛ mobiLeloginauthenticationFilter mobileLoginaUtenticationFilter = new MobileLoginAuthenticationFilter (StringUtils.Isblank (url)؟ defaultMobiLeLoginurl: url ، stringutils.isblank (parameter)؟ DefaultMobileloginHttpMethod: httpmethod) ؛ MobiLeloginaUthenticationFilter.SetAuthenticationManager (http.getsharedObject (antainticationManager.class)) ؛ MobiLeloginaUthenticationFilter.SetAuthenticationsuccessHandler (CustomaAuthenticationsuccessHandler) ؛ mobiLeloginaUthenticationFilter.SetAuthenticationFailureHandler (customauthenticationFailureHandler) ؛ MobiLeloginaUtticationProvider MobileLoginAuthenticationProvider = جديد mobileLoginAuthenticationProvider () ؛ mobiLeloginAuthenticationProvider.setCustomUserDetailsService (customerDetailsService) ؛ http.authenticationprovider (mobileLoginAuthenticationProvider) .addfilterafter (mobileLoginAuthenticationFilter ، usernamepasswordauthenticationfilter.class) ؛ }}ملاحظة: تكوين () طريقة
مصادقة مثبتة و AuthenticationProvider
أضف المصادقة Filter و AuthenticationProvider إلى Spring Security.
2.2.2. تحقق من رمز التحقق المخصص بناءً على redis
2.2.2.1. مرشح رمز التحقق المخصص بناءً على redis
/** * مرشح رمز التحقق * * author: catalpaflat */ @component (springbeannameconstant.default_validate_code_filter_bn) فئة publicalateCodeFilter يمتد مرة واحدة على الأدوات الممتازة {private static logger logger = loggerfactory.getLogger (ValidateCodeFilter.class.getName ()) ؛ Autowired private CustomMlConfig customyMlConfig ؛ @autowired private redistemplate <object ، object> redistemplate ؛ / *** فئة الأدوات التي تحدد ما إذا كان عنوان URL المطلوب يطابق عنوان URL الذي تم تكوينه*/ antpathmatcher الخاص الخاص = جديد مضاد Matcher () ؛ publicalateCodeFilter () {logger.info ("تحميل ValidateCodeFilter ...") ؛ } override void dofilterinternal (طلب httpservletrequest ، استجابة httpservletresponse ، filterchain filterchain) يلقي servletexception ، ioException {String url = customymlconfig.getlogins (). getmobile ().). if (pathmatcher.match (url ، request.getRequesturi ()))) if (stringUtils.IsBlank (deviceId)) {رمي customexception جديد (httpstatus.not_acceptable.value () ، "وليس جهاز في رأس الطلب") ؛ } string codeparamname = customyMlConfig.getLogins (). getMobile (). getParameter (). getCode () ؛ رمز السلسلة = request.getParameter (CodeParamName) ؛ if (stringUtils.isblank (code)) {رمي customexception جديد (httpstatus.not_acceptable.value () ، "لا رمز في معلمات الطلب") ؛ } string key = systemConstant.default_mobile_key_pix + deviceId ؛ smscodepo smscodepo = (smscodepo) redistemplate.opsforvalue (). الحصول على (مفتاح) ؛ if (smscodepo.isexpried ()) {رمي customexception (httpstatus.bad_request.value () ، "انتهت صلاحية رمز التحقق") ؛ } string smscode = smscodepo.getCode () ؛ if (stringUtils.isblank (smscode)) {رمي customexception جديد (httpstatus.bad_request.value () ، "رمز التحقق غير موجود") ؛ } if (stringUtils.equals (code ، smscode)) {redistemplate.delete (key) ؛ // دعها تذهب filterchain.dofilter (طلب ، استجابة) ؛ } آخر {رمي customexception جديد (httpstatus.bad_request.value () ، "رمز التحقق غير صحيح") ؛ }} else {// Let it Go FilterChain.dofilter (request ، response) ؛ }}}ملاحظة: dofilterinternal ()
التحقق من مرشح رمز التحقق المخصص
2.2.2.2. أضف مرشح رمز التحقق المخصص إلى سلسلة تصفية أمان الربيع
http.addfilterbefore
ملاحظة: قبل الإضافة إلى مرشح المعالجة المسبقة للمصادقة
3. اختبار التأثير
أخيرًا ، يتم إرفاق عنوان رمز المصدر: https://gitee.com/catalpaflat/springsecurity.git (التنزيل المحلي)
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.