Principio de implementación
En artículos anteriores, introdujimos el método de iniciar sesión con contraseñas de cuenta ordinarias: SpringBoot + Spring Security Basic Uso y Configuración de inicio de sesión personalizada. Pero ahora hay otra forma común, que es iniciar sesión directamente a través del código de verificación SMS de su teléfono móvil. Aquí necesitas hacer un trabajo extra solo.
Cualquier persona que tenga una cierta comprensión de la explicación detallada del proceso de autenticación de SpringSecurity sabe que en el proceso de autenticación de contraseña de cuenta, las siguientes categorías están involucradas: UserNamePassWordAuthenticationFilter (utilizado para solicitar la adquisición de parámetros), usernamePasswordAuthenticationToken (representa la información de logine de usuarios), Providermanager (para la verificación de la autenticación),,,, la verificación de la autenticación),,,, para la verificación de la autenticación),,,, la verificación de la autenticación),,,, para la verificación de la autenticación),,, para la verificación de la autenticación),,, para la verificación de la autenticación),,, para la verificación de la autenticación).
Debido a que se registra a través del código de verificación SMS, necesitamos reescribir los parámetros solicitados, el proceso de autenticación e información del token de inicio de sesión del usuario para una cierta cantidad.
Por supuesto, debemos poner el proceso del código de verificación primero, si el código de verificación gráfico se implementa igual. La ventaja de este enfoque es que el proceso de autenticación del código de verificación se desacopla para que también se puedan utilizar otras interfaces.
Implementación básica
Verificación del código de verificación
La implementación funcional del código de verificación SMS es en realidad el mismo que el principio del código de verificación gráfica. Es solo que uno es devolver una imagen a la parte delantera, y la otra es enviar un mensaje corto al usuario. Aquí solo necesita llamar a la interfaz del proveedor de servicios SMS. Para obtener más principios, consulte SpringBoot + SpringSecurity para implementar la función de código de verificación gráfica.
Autenticationtoken
Al iniciar sesión con la contraseña de su cuenta, el UserNamePassWordAuthenticationToken contiene la cuenta del usuario, la contraseña y otra información de estado, como si está disponible. Inicie sesión a través de SMS en el teléfono móvil, por lo que no tenemos una contraseña. Aquí solo copiamos el código UserNamePassWordAuthenticationToken y eliminamos la información relacionada con la contraseña.
clase pública SMSCODEAUTHENTICATIONTOKen extiende AbstractAuthenticationToken {private static final Long SerialVersionUid = SpringSecurityCorversion.serial_version_uid; Principal de objeto final privado; public smscodeauthenticationToken (string mobile) {super (nulo); this.principal = mobile; setAuthenticated (falso); } public smscodeauthenticationToken (principal de objeto, colección <? extiende a las autoridades de ourtedAuthority) {super (autoridades); this.principal = principal; super.setAuthenticated (verdadero); // debe usar Super, ya que anulamos} objeto público getCredentials () {return null; } objeto público getPrincipal () {return this.principal; } public void setAuthenticated (boolean isAuthenticated) arroja ilegalArgumentException {if (isAuthenticated) {throLe NewLeArTaRgumentException ("no puede establecer este token en constructor de confianza que toma una lista de Autoridad Granted en su lugar"); } super.setAuthenticated (falso); } @Override public void eraSecredentials () {super.eraSecredentials (); }} AuthenticationFilter
En el proceso de inicio de sesión en la contraseña de la cuenta, el valor predeterminado es UserNamePassWordAuthenticationFilter. Su función es obtener la cuenta y la contraseña de la solicitud, verificar el método de solicitud y generar una autenticación que Aquí nuestros parámetros han cambiado de cierta manera, por lo que sigue siendo el método anterior, copiar para hacer modificaciones simples
clase pública smscodeauthenticationFilter extiende abstractAuthenticationProcessingFilter {// Parámetros de solicitud clave Cadena privada MobileParameter = SecurityConstants.default_parameter_name_mobile; // ¿Solo es compatible con el booleano privado Postny = true; public smscodeauthenticationFilter () {// Solicite la URL de la interfaz Super (nueva AntPathRequestMatcher (SecurityConstants.default_login_processing_url_mobile, "post")); } Public Authentication intentAuthentication (httpservletRequest solicitud, httpservletResponse respuesta) lanza autenticaciónxception {if (postonly &&! request.getMethod (). Equals ("post")) {Throw New AuthenticationServiceException ("Método de autenticación no admitido:" + request.getMethod ()); } // Obtenga el valor de solicitud de acuerdo con la cadena de nombre del parámetro de solicitud mobile = obtanMobile (solicitud); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); // Generar la autenticación correspondiente SMSCODEAUTHENTICATIONITATIVE Authrequest = new SMSCodeAuthenticationToken (móvil); setDetails (solicitud, authRequest); devuelve this.getAuthenticationManager (). Authenticate (Authrequest); } / *** Obtenga el número de móvil* / String protegido ObtenerMobile (HTTPServletRequest solicitud) {return request.getParameter (mobileParameter); } // omitir código irrelevante} Proveedor
Durante el proceso de inicio de sesión de la contraseña de la cuenta, la corrección de la contraseña y si la cuenta está disponible se verifica a través del DaoAuthenticationProvider. También debemos implementar un proveedor nosotros mismos
clase pública SMSCODEAUTHENTICATIONSProvider implementa AuthenticationProvider {privado userDetailsService userDetailsService; / ** * Verificación de lógica de identidad * @param autenticación * @return * @throws autenticationException */ @Override public autenticación autenticación (autenticación autenticación) lanza autenticaciónxception {smscodeauthenticationToken autenticación = (smscodeauthenticationToke) autenticación; UserDetails user = userDetailsService.LoadUserByUsername ((String) AuthenticationToken.getPrincipal ()); if (user == null) {lanzar newalAutTauthenticationServiceException ("No se puede obtener información del usuario"); } SMSCODEAUTHENTICATIONTOKE AuthenticationResult = new SMSCodeAuthenticationToken (user, user.getAuthorities ()); autenticationResult.setDetails (autenticationToken.getDetails ()); return AuthenticationResult; } @Override public boolean admite (clase <?> Autenticación) {return smscodeauthenticationToken.class.isassignableFrom (autenticación); } public userDetailsService getUserDetailsService () {return userDetailsService; } public void setUserDetailsService (UserDetailsService UserDetailsService) {this.userDetailsService = userDetailsService; }} Configuración
El principal proceso de autenticación se logra a través de los cuatro procesos anteriores. Aquí podemos reducir su configuración.
@ComponentPublic SMSCODEAUTHENTATIONATIONSECURITYCONFIG extiende SecurityConfigurerAdapter <DefaultSecurityFilterChain, httpSecurity> {@AUTOWIREDIREDIRDIREDIRD AuthenticationsuccessHandler MyAuthenticationSuccessHandler; @AUTOWIRED Authentication privateFailureHandler myauthenticationFailureHandler; @AUTOWIREDIREDIREDEDREDEDREDEDETAILSSERVICE USERDETAILSSERVICE; @Override public void configure (httpsecurity http) lanza la excepción {smscodeauthenticationFilter smscodeauthenticationFilter = new SmScodeauthenticationFilter (); SMSCODEAUTHENCATIONFILTER.SetAuthenticationManager (http.getSharedObject (autenticación de ganager.class)); SMSCODEAUTHENTICACIÓNFilter.SetAuthenticationsUccessHandler (myauthenticationsuccessHandler); SMSCODEAUTHENTICACIÓNFILTER.SETAUTHENTICACIÓNFAILUREHANDLER (myauthenticationFailureHandler); SMSCODEAUTHENCATIONSPROVIDER SMSCODEAUTHENTICATIONSPROVIDER = new SMSCODEAUTHENCATIONSPROVIDER (); SMSCODEAUTHENTICATIONSPROVIDER.SetUserDetailsService (UserDetailsService); http.authenticationProvider (SMScodeauthenticationProvider) .AddFilterAfter (SMSCODEAUTHENCATIONFILTER, USERNAMEPASSWORDAUTHENTICACEFILTER.CLASS); }} // BrowerSecurityConfig.java@overrideprotected Void Configurar (httpsecurity http) lanza la excepción {http.apply (smscodeauthenticationSecurityCig);} Descarga de código
Seguridad en la primavera
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.