หลักการดำเนินการ
ในบทความก่อนหน้านี้เราได้แนะนำวิธีการบันทึกด้วยรหัสผ่านบัญชีทั่วไป: Springboot + การใช้งานพื้นฐานความปลอดภัยของสปริงและการกำหนดค่าการเข้าสู่ระบบส่วนบุคคล แต่ตอนนี้มีวิธีทั่วไปอีกวิธีหนึ่งซึ่งก็คือการเข้าสู่ระบบโดยตรงผ่านรหัสการตรวจสอบ SMS ของโทรศัพท์มือถือของคุณ ที่นี่คุณต้องทำงานพิเศษด้วยตัวเอง
ทุกคนที่มีความเข้าใจอย่างชัดเจนเกี่ยวกับคำอธิบายโดยละเอียดของกระบวนการตรวจสอบความปลอดภัยของสปริงส์รู้ว่าในกระบวนการตรวจสอบรหัสผ่านบัญชีหมวดหมู่ต่อไปนี้เกี่ยวข้อง: UserNamePasswordauthenticationFilter (ใช้เพื่อขอพารามิเตอร์ที่ได้มา)
เนื่องจากมีการลงชื่อเข้าใช้ผ่านรหัสการตรวจสอบ SMS เราจึงต้องเขียนพารามิเตอร์ที่ร้องขอกระบวนการรับรองความถูกต้องและข้อมูลโทเค็นเข้าสู่ระบบของผู้ใช้ในจำนวนที่กำหนด
แน่นอนเราควรวางกระบวนการตรวจสอบรหัสก่อนหากรหัสการตรวจสอบกราฟิกถูกนำไปใช้เหมือนกัน ข้อดีของวิธีการนี้คือกระบวนการตรวจสอบรหัสการตรวจสอบถูกแยกออกเพื่อให้สามารถใช้อินเทอร์เฟซอื่นได้
การใช้งานขั้นพื้นฐาน
การตรวจสอบรหัสการตรวจสอบ
การใช้งานการทำงานของรหัสการตรวจสอบ SMS นั้นเหมือนกันกับหลักการของรหัสการตรวจสอบกราฟิก มันเป็นเพียงการส่งคืนรูปภาพไปที่ส่วนหน้าและอีกอันคือการส่งข้อความสั้น ๆ ไปยังผู้ใช้ ที่นี่คุณเพียงแค่ต้องโทรหาอินเทอร์เฟซของผู้ให้บริการ SMS สำหรับหลักการเพิ่มเติมโปรดดูที่ Springboot + Springsecurity เพื่อใช้ฟังก์ชั่นรหัสการตรวจสอบกราฟิก
AuthenticationToken
เมื่อลงชื่อเข้าใช้ด้วยรหัสผ่านบัญชีของคุณ UserNamePasswordaThenticationToken จะมีบัญชีรหัสผ่านและข้อมูลสถานะอื่น ๆ ของผู้ใช้เช่นว่ามีอยู่หรือไม่ เราเข้าสู่ระบบ SMS บนโทรศัพท์มือถือดังนั้นเราจึงไม่มีรหัสผ่าน ที่นี่เราเพิ่งคัดลอกรหัส UserNamePasswordAuthenticationToken และลบข้อมูลที่เกี่ยวข้องกับรหัสผ่าน
ระดับสาธารณะ SMSCODEAUTHENTICATIONTOKEN ขยาย AbstractauthenticationToken {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = SpringsecurityCoreVersion.serial_Version_UID; อาจารย์ใหญ่วัตถุสุดท้ายส่วนตัว; สาธารณะ smscodeauthenticationToken (สตริงมือถือ) {super (null); this.principal = มือถือ; setauthenticated (เท็จ); } สาธารณะ SMSCODEAUTHENTICATIONTOKEN (Object Principal, Collection <? ขยาย Grantedauthority> เจ้าหน้าที่) {Super (เจ้าหน้าที่); this.principal = principal; super.setauthenticated (จริง); // ต้องใช้ super ในขณะที่เราแทนที่} วัตถุสาธารณะ getCredentials () {return null; } วัตถุสาธารณะ getPrincipal () {return this.principal; } โมฆะสาธารณะ setauthenticated (บูลีน isauthenticated) พ่น unledalargumentexception {ถ้า (isauthenticated) {โยน unlegalargumentException ใหม่ ("ไม่สามารถตั้งโทเค็นนี้ให้เชื่อถือได้ - ใช้ตัวสร้าง } super.setauthenticated (เท็จ); } @Override โมฆะสาธารณะ erasecredentials () {super.erasecredentials (); - AuthenticationFilter
ในขั้นตอนการเข้าสู่ระบบในรหัสผ่านบัญชีค่าเริ่มต้นคือ UserNamePasswordAuthenticationFilter ฟังก์ชั่นของมันคือการรับบัญชีและรหัสผ่านจากคำขอตรวจสอบวิธีการร้องขอและสร้างการรับรองความถูกต้อง ที่นี่พารามิเตอร์ของเราเปลี่ยนไปด้วยวิธีใดวิธีหนึ่งดังนั้นจึงยังคงเป็นวิธีเก่าคัดลอกเพื่อทำการแก้ไขอย่างง่าย
ระดับสาธารณะ smscodeauthenticationFilter ขยาย AbstractauthenticationProcessingFilter {// พารามิเตอร์การร้องขอคีย์สตริงส่วนตัว mobileparameter = SecurityConstants.default_parameter_name_mobile; // เป็นเพียงการสนับสนุนโพสต์ส่วนตัวบูลีน postonly = true; สาธารณะ smscodeauthenticationFilter () {// ร้องขอ URL ของอินเตอร์เฟส Super (ใหม่ antpathRequestMatcher (SecurityConstants.default_login_processing_url_mobile, "Post")); } การตรวจสอบความถูกต้องสาธารณะ retryauthentication (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) โยนการรับรองความถูกต้อง {ถ้า (postonly &&! request.getMethod (). เท่ากับ ("โพสต์")) {โยนการรับรองความถูกต้องใหม่ } // รับค่าการร้องขอตามพารามิเตอร์ชื่อพารามิเตอร์สตริงมือถือ = ได้รับ mobile (คำขอ); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); // สร้าง AuthenticationToken SMSCODEAUTHENTICATIONTOKEN AuthRequest ที่สอดคล้องกัน setDetails (คำขอ AuthRequest); ส่งคืนสิ่งนี้ GetAuthenticationManager (). Authenticate (AuthRequest); } / *** รับหมายเลขมือถือ* / สตริงที่ได้รับการป้องกัน atainMobile (คำขอ httpservletRequest) {return request.getParameter (MobileParameter); } // ละเว้นรหัสที่ไม่เกี่ยวข้อง} ผู้ให้บริการ
ในระหว่างกระบวนการเข้าสู่ระบบของรหัสผ่านบัญชีความถูกต้องของรหัสผ่านและว่าบัญชีนั้นพร้อมใช้งานผ่าน DaoauthenticationProvider หรือไม่ เราควรใช้ผู้ให้บริการด้วยตนเอง
ระดับสาธารณะ SMSCODEAUTHENTICATIONPROVIDER ใช้ AuthenticationProvider {UserDetailsService ส่วนตัว UserDetailsService; / ** * การตรวจสอบลอจิกของ Identity * @param การรับรองความถูกต้อง * @return * @throws AuthenticationException */ @Override การรับรองความถูกต้องของการตรวจสอบความถูกต้องสาธารณะ (การรับรองความถูกต้องการรับรองความถูกต้อง) โยนการรับรองความถูกต้อง {smscodeauthenticationToken AuthenticationToken = (smscodeauthentication UserDetails user = userDetailsService.loadUserByUserName ((String) AuthenticationToken.getPrincipal ()); if (user == null) {โยน InternalauthenticationserviceException ใหม่ ("ข้อมูลผู้ใช้ไม่สามารถรับได้"); } smscodeauthenticationToken AuthenticationResult = ใหม่ smscodeauthenticationToken (ผู้ใช้, user.getAuthorities ()); AuthenticationResult.setDetails (AuthenticationToken.getDetails ()); ส่งคืนการรับรองความถูกต้อง } @Override บูลีนสาธารณะสนับสนุน (คลาส <?> การตรวจสอบ) {ส่งคืน smscodeauthenticationToken.class.isassignable from (การตรวจสอบ); } Public UserDetailsService getUserDetailsService () {return userDetailsService; } โมฆะสาธารณะ setUserDetailsService (userDetailsService userDetailsService) {this.userDetailsService = userDetailService; - การกำหนดค่า
กระบวนการตรวจสอบหลักทำได้ผ่านกระบวนการสี่กระบวนการข้างต้น ที่นี่เราสามารถลดการกำหนดค่าของพวกเขา
@ComponentPublic คลาส SMSCODEAUTHENTICATIONSECURITIONCOUNTHONFIG ขยาย SecurityConfigurerAdapter <ค่าเริ่มต้น SecurityFilterChain, httpsecurity> {@autowired การตรวจสอบสิทธิ์ส่วนตัว @autowired AuthenticationFailureHandler MyauthenticationFailureHandler; @AutoWired Private UserDetailsService UserDetailsService; @Override โมฆะสาธารณะกำหนดค่า (httpsecurity http) พ่นข้อยกเว้น {smscodeauthenticationfilter smscodeauthenticationFilter = ใหม่ smscodeauthenticationFilter (); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICATIONMANAGER (http.getSharedObject (AuthenticationManager.class)); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICATIONSUCCESCESSHANDLER (myauthenticationsuccesshandler); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICATIONFAILUREHANDLER (MYAUTHENTICATIONFAILUREHANDLER); SMSCODEAUTHENTICATIONPROVIDER SMSCODEAUTHENTICATIONPROVIDER = ใหม่ SMSCODEAUTHENTICATIONPROVIDER (); SMSCODEAUTHENTICATIONPROVIDER.SETUSERDETAILSSERVICE (USERDETAILSSERVICE); http.authenticationprovider (smscodeauthenticationprovider) .addfilterafter (smscodeauthenticationFilter, usernamepasswordauthenticationfilter.class); }} // browersecurityconfig.java@overrideprotected void configure (httpsecurity http) โยนข้อยกเว้น {http.apply (smscodeauthenticationsecurityconitionconitionconitioncurity);} ดาวน์โหลดรหัส
ความปลอดภัยในฤดูใบไม้ผลิ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น