Spring Security adalah modul besar, dan artikel ini hanya melibatkan otentikasi parameter khusus. Parameter verifikasi default dari musim semi hanya nama pengguna dan kata sandi, yang umumnya tidak cukup. Karena waktu telah berlalu terlalu lama, beberapa melupakan dan beberapa dari mereka mungkin hilang. Oke, tidak ada omong kosong.
Konfigurasi keamanan pegas dan musim semi menggunakan javaconfig, dan versinya 4.2.5 dan 4.0.4 pada gilirannya.
Gagasan keseluruhan: Kustomisasi Entrypoint, tambahkan parameter khusus untuk memperluas AuthenticationToken dan AuthenticationProvider untuk verifikasi.
Tentukan titik entri pertama:
Impor org.springframework.security.core.authenticationException; impor org.springframework.security.web.authentication.loginurlauthenticationentrypoint; javax.servlet.http.httpservletResponse; impor java.io.ioException; kelas publik myauthenticationEntrypoint memperluas LoginUrlAuthenticationEntrypoint {public myAuthenticationEntrypoint (String LoginFormUrl) {superformurl); } @Override public void commence (permintaan httpservletrequest, respons httpservletResponse, authenticationException authexception) melempar IOException, ServletException {super.Commence (permintaan, respons, authexception); }}Berikutnya adalah Token, ValidCode adalah parameter kode verifikasi:
Impor org.springframework.security.authentication.usernamepasswordAuthenticationToken; kelas publik myusernamepasswordAuthenticationToken memperluas UserNamepasswordAuthenticationToken {private string validCode; Public MyUserNamePasswordAuthenticationToken (String Principal, String Credentials, String ValidCode) {super (prinsipal, kredensial); this.validCode = validCode; } public String getValidCode () {return validCode; } public void setValidCode (String validCode) {this.validCode = validCode; }}Lanjutkan ProcessingFilter,
impor com.core.shared.validateCodeHandle; impor org.springframework.security.core.authentication; impor org.springframework.security.core.AuthenticationException; impor org.springframework.security.web.Athentication.abstractacation org.springframework.security.web.util.matcher.antpathRequestMatcher; import javax.servlet.servletException; import javax.servlet.http.httpservletrequest; impor javax.servlet.http.httpservet; javax.servlet.http.httpsession; impor java.io.ioException; kelas publik myvalidcodeprocessingfilter memperluas abstractAuthenticationProcessingFilter {private string usernameparam = "username"; Private String PasswordParam = "Kata Sandi"; Private String ValidCodeparam = "ValidAtecode"; public myvalidCodeprocessingFilter () {super (antpathrequestMatcher baru ("/user/login", "post")); } @Override Public Authentication TREDAuthentication (permintaan httpservletRequest, respons httpservletResponse) melempar otentikasi exception, ioException, servletException {string username = request.getParameter (usernameparam); String password = request.getParameter (kata sandiParam); String validCode = request.getParameter (validCodeParam); valid (validCode, request.getSession ()); MyusernamepasswordAuthenticationToken token = myusernamepasswordAuthenticationToken baru (nama pengguna, kata sandi, validcode); kembalikan this.getAuthenticationManager (). Otentikasi (token); } public void valid (String validCode, httpsession sesi) {if (validCode == null) {throw new ValidCodeerRoreRexception ("ValidateCode kosong!"); } if (! ValidateCodeHandle.MatchCode (session.getId (), validCode)) {throw new ValidCodeerRorException ("ValidCodeError!"); }}} Tentukan tiga parameter secara terpisah, yang digunakan untuk menerima parameter dari formulir login. Metode konstruksi memberikan URL login dan metode pos yang diperlukan
Berikutnya adalah otentikasi. Sebelum nama pengguna otentikasi dan kata sandi telah tiba, saya baru saja mengotentikasi kode verifikasi.
Berikut adalah kelas alat validateCodeHandle dan validCodeerRorexception:
impor java.util.concurrent.concurrenthashMap; kelas publik validateCodeHandle {private static concurrenthashMap validateCode = concurrenthashmap baru <> (); public static concurrenthashmap getCode () {return validateCode; } public static void save (string sessionId, string code) {validateCode.put (sessionId, kode); } public static string getValidateCode (string sessionId) {objek obj = validateCode.get (sessionId); if (obj! = null) {return string.valueof (obj); } return null; } public static boolean matchCode (string sessionId, string inputCode) {string saveCode = getValIdateCode (sessionId); if (saveCode.equals (inputCode)) {return true; } return false; }}Di sini Anda perlu mewarisi OtenticationException untuk menunjukkan bahwa itu adalah kegagalan otentikasi keamanan, sehingga proses kegagalan selanjutnya akan diikuti.
Impor org.springframework.security.core.authenticationException; kelas publik validCodeerRorException memperluas authenticationException {public validCodeerRorException (string msg) {super (msg); } public validCodeerRorException (string msg, throwable t) {super (msg, t); }}Berikutnya adalah penyedia:
impor org.springframework.security.authentication.badcredentialSException; impor org.springframework.security.authentication.usernepasswordAuthenticationToken; impor org.springframework.security.Authentication.dao.daoAuthenticationDramework.security org.springframework. MyusernamepasswordAuthenticationToken.class.isassignableFrom (otentikasi); } @Override void tambahan tambahan aProfenticationChecks (userDetails userdetails, usernamepasswordAuthenticationToken otentikasi) melempar otentikasi exception {objek garam = null; if (getSaltSource ()! = null) {Salt = getSaltsource (). getSalt (userDetails); } if (authentication.getCredentials () == null) {logger.debug ("Otentikasi gagal: tidak ada kredensial yang disediakan"); Lempar BadcredentialSException baru ("Nama pengguna atau kesalahan kata sandi!"); } String presentedpassword = authentication.getCredentials (). ToString (); if (! this.getPasswordEncoder (). isPasswordValid (userDetails.getPassword (), presedPassword, Salt)) {logger.debug ("Otentikasi gagal: Kata sandi tidak cocok dengan nilai tersimpan"); Lemparkan BadcredentialSException baru ("Di bawah Nama Pengguna atau Kata Sandi!"); }}} Metode pendukung menentukan penggunaan token khusus, dan metode tambahan yang tidak sesuai sama persis dengan logika kelas induk, saya baru saja mengubah informasi yang dikembalikan oleh pengecualian.
Berikutnya adalah penangan yang menangani otentikasi yang berhasil dan otentikasi yang gagal
Impor org.springframework.security.core.authentication; impor org.springframework.security.web.authentication.simpleurlauthenticationsuccesshandler; impor javax.servlet.servletException; impor javax.servlet.http.httpserv; javax.servlet.http.httpservletResponse; import java.io.ioException; kelas publik frontAuthenticationuccesshandler memperluas simpleUrlAuthenticationsuccessHandler {publictAuthenticationsCessHandler (string defaultTargetUrl) {super (default); } @Override public void onAuthenticationsuccess (permintaan httpservletRequest, respons httpservletResponse, otentikasi otentikasi) melempar ioException, servletException {super.onauthenticationuccess (permintaan, otentikasi); }} Impor org.springframework.security.core.authenticationException; impor org.springframework.security.web.authentication.simpleurlauthenticationFailureReHandler; impor javax.servlet.servletexception; impor javax.servlet.http.http.htp.htp.htp.htpserved; javax.servlet.http.httpservletResponse; impor java.io.ioException; kelas publik frontAuthenticationFailureHandler memperluas SimpleurlAuthenticationFailureureRler {PublicFailureRureureRure (String defaultFailureurl) {superfail } @Override public void onAuthenticationFailure (permintaan httpservletRequest, respons httpservletResponse, pengecualian extentication exception) melempar ioException, servletException {super.onauthenticationFailure (permintaan, respons, pengecualian); }}Akhirnya, konfigurasi keamanan terpenting:
impor com.service.user.customerservice; import com.web.filter.sitemeshfilter; impor com.web.mysecurity.*; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.context.notation org.springframework. org.springframework org.springframework org.springframework.security.web.access.exceptionTranslationFilter; impor org.springframework.security.web.authentication.usernamepasswordAuthenticationFilter; impor org.springframework.security.web.context.abstractspactsecurity org.springframework.web.filter.characterencodingfilter; impor javax.servlet.dispatcherType; impor javax.servlet.filterregistrasi; impor javax.servlet.servletcontext; impor java.util.arraylist; impor java. java.util.list;@configuration@enableWebsecurityPublic Class SecurityConfig Memperluas AbstractSecurityWebApplicationInitializer {@Bean Public Passwordencoder Kata SandiCoder () {return New StandardPasswordEncoder ("MD5"); } @Autowired Private CustomerService Service; @Configuration @order (1) Public Static Class FrontendWebSecurityConfigureAdapter memperluas WebSecurityConfigurerAdapter {@Autowired private myValidCodeprocessingFilter myvalidCodeprocessingFilter; @Override Protected void configure (httpsecurity http) melempar Exception {http.csrf (). Disable () .AuthorizeRequests () .AntMatchers ("/user/login", "/user/logout"). Permitall (). .addfilterBefore (myvalidcodeprocessingfilter, usernamepasswordAuthenticationFilter.class) .FormLogin () .loginpage ("/user/login") .logoutcs () .logoutUrl ("/pengguna/logout") .logoutccs () .logouturl ("/user/logout") .logoutcscscscs () .logouturl ("/user/logout") .logoutCCS () .LogoutUrl ("/User/LOGOUT") .LOGOUTCCSCES }} @Bean (name = "frontAuthenticationProvider") public myAuthenticationProvider frontAuthenticationProvider () {myauthenticationProvider myauthenticationProvider = myauthenticationProvider () baru; myauthenticationprovider.setUserdetailsService (customerservice); myAuthenticationProvider.SetPasswordEncoder (kata sandicoder ()); return myAuthenticationProvider; } @Bean Public AuthenticationManager AuthenticationManager () {List <OuthenticationProvider> Daftar = ArrayList baru <> (); list.add (frontAuthenticationProvider ()); AuthenticationManager AuthenticationManager = New ProviderManager (Daftar); Return AuthenticationManager; } @Bean public myvalidcodeprocessingfilter myvalidcodeprocessingFilter (authenticationManager authenticationManager) {myvalidcodeprocessingFilter filter = myvalidcodeprocessingFilter baru (); filter.setAuthenticationManager (authenticationManager); filter.setAuthenticationsuccesshandler (frontAuthenticationsuccesshandler ()); filter.setAuthenticationFailureHandler (frontAuthenticationFailureHandler ()); filter pengembalian; } @Bean Public FrontAuthenticationFailureHandler FrontAuthenticationFailureHandler () {return New FrontAuthenticationFailureHandler ("/User/Login"); } @Bean Public FrontAuthenticationsUCCessHandler FrontAuthenticationsuccessHandler () {return New FrontAuthenticationsUCCessHandler ("/Front/Test"); } @Bean public myAuthenticationEntrypoint myAuthenticationEntrypoint () {return baru myAuthenticationEntrypoint ("/user/login"); }}Pertama -tama, ini adalah kacang dari kelas enkripsi, dan layanan pelanggan adalah pengguna kueri yang sederhana
@Service ("Customerservice") Kelas Publik CustomerServiceImpl mengimplementasikan layanan pelanggan {@Autowired private userdao userdao; @Override Public UserDetails LoadUserByUserName (String username) melempar UsernamenotFoundException {return userdao.findcustomerbyusername (username); }} Berikutnya adalah FrontendWebSecurityConfigureadapter. Saya menulis ulang metode konfigurasi, pertama -tama nonaktifkan CSRF, aktifkan otorizeRequests (), di mana "/pengguna/login" dan "/pengguna/logout" Lepaskan verifikasi izin, dan permintaan lainnya memerlukan otentikasi login, dan kemudian addFilterBefore (). Sebelum menambahkan myValidCodeprocessingFilter kustom saya ke USERNAMEPASSWORDAuthenticationFilter default dalam keamanan, pertama -tama saya melakukan otentikasi parameter khusus saya, dan kemudian formlogin (), mengkonfigurasi URL login dan logout URL, dan login URL, adalah URL Login, URL Login, dan URL LOGIN OUT.
Berikutnya adalah deklarasi tampilan kacang dari AuthenticationProvider, AuthenticationManager, ProcessingFilter, AuthenticationFailureHandler, Authenticationuccesshandler, dan Entrypoint.
Di bawah ini adalah login.jsp
<body> <div> <form: form autoComplete = "false" commandName = "userdto" method = "Post"> <div> <span> <b> $ {spring_security_last_exception.message} </b> </span> </diver "Form: Form: input Path =" Username "CSS: CSS: CSS: CSSPUTORY = FORMASI" " path = "kata sandi" cssclass = "form-control"/> <br/> validatecode: <form: input path = "validatecode" cssclass = "form-control"/<label> $ {validate_code} </label> <Div> <label> <input type = "cecekbox" name " value = "Kirim"/> </form: form> </div> </body>Ketika kode verifikasi gagal, validCodeerRoreRexception dilemparkan. Karena mewarisi AuthenticationException, ketika keamanan bertemu AuthenticationException, otentikasiFailureHandler akan dipicu. Kacang di atas menyatakan bahwa otentikasi gagal dan melompat ke URL login, jadi ada $ {spring_security_last_exception.message} di login.jsp. Informasi pengecualian dilemparkan saat saya mengotentikasi, yang dapat mendorong pengguna ramah.
Seluruh proses verifikasi keamanan khusus selesai
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.