مبدأ التنفيذ
في المقالات السابقة ، أدخلنا طريقة تسجيل الدخول باستخدام كلمات مرور الحساب العادية: Springboot + Spring Security Usage و Configuration Personalized Login. ولكن هناك طريقة شائعة أخرى الآن ، وهي تسجيل الدخول مباشرة من خلال رمز التحقق من الرسائل القصيرة لهاتفك المحمول. هنا تحتاج إلى القيام ببعض الأعمال الإضافية بنفسك.
أي شخص لديه فهم معين للتفسير التفصيلي لعملية مصادقة الأمن الينبصي يعلم أنه في عملية مصادقة كلمة مرور الحساب ، تشارك الفئات التالية: usernamePasswordauthenticationFilter (المستخدمة لطلب الاستحواذ على المعلمة) ، usernamePasswordauthenticationoken (يمثل معلومات تسجيل الدخول إلى المستخدم) ، Fividermanager (للتحقق من المصادقة) ،
نظرًا لأنه يتم تسجيل الدخول من خلال رمز التحقق من الرسائل القصيرة ، نحتاج إلى إعادة كتابة المعلمات المطلوبة ، وعملية المصادقة ، ومعلومات رمز تسجيل الدخول إلى المستخدم مقابل مبلغ معين.
بالطبع ، يجب أن نضع عملية رمز التحقق أولاً ، إذا تم تنفيذ رمز التحقق من الرسوم على نفس المنوال. تتمثل ميزة هذا النهج في أن عملية مصادقة رمز التحقق مفصول بحيث يمكن أيضًا استخدام واجهات أخرى.
التنفيذ الأساسي
التحقق من رمز التحقق
إن التنفيذ الوظيفي لرمز التحقق من الرسائل القصيرة هو في الواقع نفس مبدأ رمز التحقق من الرسوم. إن أحدهما هو إعادة صورة إلى الواجهة الأمامية ، والآخر هو إرسال رسالة قصيرة إلى المستخدم. هنا تحتاج فقط إلى الاتصال بواجهة مزود خدمة الرسائل القصيرة. لمزيد من المبادئ ، يرجى الرجوع إلى SpringBoot + SpringSecurity لتنفيذ وظيفة رمز التحقق الرسومية.
المصادقة
عند تسجيل الدخول بكلمة مرور حسابك ، يحتوي usernamepasswordauthenticationToken على حساب المستخدم وكلمة المرور ومعلومات الحالة الأخرى مثل ما إذا كانت متوفرة. نقوم بتسجيل الدخول عبر الرسائل القصيرة على الهاتف المحمول ، لذلك ليس لدينا كلمة مرور. هنا نقوم فقط بنسخ رمز UserNamePasswordAuthenticationToken وإزالة المعلومات المتعلقة بكلمة المرور.
الطبقة العامة smscodeAuthenticationToken يمتد ملخص attractActionToken {private static static Final Long SerialVersionuid = SpringSecurityCorevent.serial_version_uid ؛ كائن نهائي خاص ؛ smScodeAuthenticationToken (سلسلة mobile) {super (null) ؛ this.principal = mobile ؛ setAuthenticated (خطأ) ؛ } smScodeAuthenticationToken العامة (كائن رئيسي ، المجموعة <؟ يمتد السلطات GrantedAuthority>) this.principal = المدير ؛ super.setauthenticated (صحيح) ؛ // يجب استخدام Super ، حيث نقوم بتجاوز} getCredentials () {return null ؛ } الكائن العام getPrincipal () {return this.principal ؛ } public void setauthenticated (boolean isauthenticated) يلقي alfictalargumentException {if (isauthenticated) {رمي جديد غير alficalargumentexception ( } super.setAuthenticated (false) ؛ } Override public void erasecredentials () {super.erasecredentials () ؛ }} المصادقة
في عملية تسجيل كلمة مرور الحساب ، يكون الافتراضي هو usernamepasswordauthenticationFilter. تتمثل وظيفتها في الحصول على الحساب وكلمة المرور من الطلب ، والتحقق من طريقة الطلب ، وإنشاء مصادقة. هنا تغيرت معلماتنا بطريقة معينة ، لذلك لا تزال الطريقة القديمة ، نسخ لإجراء تعديلات بسيطة
الطبقة العامة SMSCODEAUTHENTICATIONSFILTER يمتد الملخصات ustracticationprocessingfilter {// طلب المعلمات مفتاح سلسلة خاصة mobileparameter = securityConstants.default_parameter_name_mobile ؛ // هل هو مدعوم فقط بعد ما بعد منطقية postonly = صواب ؛ SmScodeAuthenticationFilter () {// اطلب عنوان URL للواجهة Super (AntpathRequestMatcher جديد (SecurityConstants.default_login_processing_url_mobile ، "post")) ؛ } محاولة المصادقة العامة (طلب httpservletRequest ، استجابة httpservletresponse) يرمي المصادقة {if (postonly &&! request.getMethod (). يساوي ("post")) } // الحصول على قيمة الطلب وفقًا لسلسلة اسم المعلمة mobile = getmobile (request) ؛ if (mobile == null) {mobile = "" ؛ } mobile = mobile.trim () ؛ . setDetails (طلب ، authRequest) ؛ إرجاع this.getAuthenticationManager (). المصادقة (AuthRequest) ؛ } / *** احصل على رقم الهاتف المحمول* / سلسلة محمية GetMobile (طلب httpservletrequest) {return request.getParameter (mobileparameter) ؛ } // حذف الكود غير ذي صلة} مزود
أثناء عملية تسجيل دخول كلمة مرور الحساب ، يتم التحقق من صحة كلمة المرور وما إذا كان الحساب متاحًا من خلال DaoAuthenticationProvider. يجب علينا أيضًا تنفيذ مزود لأنفسنا
الطبقة العامة smscodeauthenticationprovider تنفذ المصادقة {userDetailsService userDetailsService ؛ / ** * التحقق من منطق الهوية * @Param مصادقة * REGRANT * Throws AuthenticationException */ Override مصادقة المصادقة العامة (مصادقة المصادقة) يلقي المصادقة {smscodeauthenticationtoken antainticaltoken = (smscodeauthenticationtoken) المصادقة ؛ userDetails user = userDetailsService.LoadUserByUserName ((string) antrugleToken.getPrincipal ()) ؛ if (user == null) {رمي internalauthenticationserviceException ("لا يمكن الحصول على معلومات المستخدم") ؛ } smScodeAuthenticationToken AuthenticationResult = جديد smscodeAuthenticationToken (المستخدم ، user.getAuthorities ()) ؛ AuthenticationResult. إرجاع المصادقة. } Override Public Boolean Support (Class <؟> المصادقة) {return smscodeauthenticationtoken.class.isassignableFrom (المصادقة) ؛ } userDetailsService getUserDetailsService () {return userDetailsService ؛ } public void setUserDetailsService (userDetailsService userDetailsService) {this.userDetailsService = userDetailsService ؛ }} إعدادات
يتم تحقيق عملية المصادقة الرئيسية من خلال العمليات الأربع المذكورة أعلاه. هنا يمكننا تقليل تكوينها.
@componentpublic class smscodeauthenticationicationsCurityConfig يمتد SecurityConfigureRadapter <defaultSecurityFilterchain ، httpsecurity> {Auutowired private antanticationsucessHandler myAuthenticationsAcsHandler ؛ AUTOWIRED PRIVATE FUENTICATIONFAILUREHALLERLER MYAUTHENTICATIONFAILUREHERDER ؛ AUTOWIRED userDetailsService userDetailsService ؛ Override public void تكوين (httpsecurity http) يلقي الاستثناء {smscodeauthenticationfilter smscodeauthenticationfilter = new smscodeauthenticationfilter () ؛ smScodeAuthenticationFilter.SetAuthenticationManager (http.getSharedObject (antainticationManager.class)) ؛ smscodeauthenticationfilter.setauthenticationsuccessHandler (myauthenticationsuccessHandler) ؛ smscodeauthenticationfilter.setauthenticationFailureHandler (myauthenticationFailureHandler) ؛ smscodeauthenticationprovider smscodeauthenticationprovider = جديد smscodeauthenticationprovider () ؛ smscodeauthenticationprovider.setUserDetailsService (userDetailsService) ؛ http.AuthenticationProvider (smscodeauthenticationprovider) .addfilterafter (smscodeauthenticationfilter ، usernamepasswordauthenticationfilter.class) ؛ }} // browersecurityconfig.java@overrideprotected configive (httpsecurity http) يلقي الاستثناء {http.apply (smscodeauthenticationsCurityConfig) ؛} تنزيل رمز
الربيع الأمن
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.