Princípio da implementação
Em artigos anteriores, introduzimos o método de fazer login com senhas de conta comuns: Springboot + Spring Security Uso básico e configuração personalizada de login. Mas há outra maneira comum agora, que é fazer login diretamente através do código de verificação do SMS do seu telefone celular. Aqui você precisa fazer algum trabalho extra sozinho.
Qualquer pessoa que tenha uma certa compreensão da explicação detalhada do processo de autenticação SpringSecurity sabe que, no processo de autenticação por senha da conta, estão envolvidas as seguintes categorias: UsernamePasswordAthenticationFilter (usado para solicitar aquisição de parâmetros), UsernamePordAthentationToken (Representa Login Information), ProviderManager (para autenticação para autenticação (reproduza o Login do usuário), manager (para a autenticação do usuário), para a autenticação do usuário (reproduza o login do usuário), o reprididor (para a autenticação do usuário), para o managro (para a autenticação do usuário).
Como ele está conectado através do código de verificação do SMS, precisamos reescrever os parâmetros solicitados, o processo de autenticação e as informações do token de login do usuário para um determinado valor.
Obviamente, devemos colocar o processo de código de verificação em primeiro lugar, se o código de verificação gráfico for implementado da mesma forma. A vantagem dessa abordagem é que o processo de autenticação do código de verificação é dissociado para que outras interfaces também possam ser usadas.
Implementação básica
Verificação de código de verificação
A implementação funcional do código de verificação do SMS é realmente o mesmo que o princípio do código de verificação gráfico. É apenas que um é retornar uma imagem ao front -end, e a outra é enviar uma mensagem curta ao usuário. Aqui você só precisa chamar a interface do provedor de serviços SMS. Para obter mais princípios, consulte o Springboot + SpringSecurity para implementar a função de código de verificação gráfica.
AuthenticationToken
Ao fazer login com a senha da sua conta, o UserNamePassWordAuthenticationToken contém a conta do usuário, a senha e outras informações de status, como se ela está disponível. Fazemos login através do SMS no telefone celular, para não termos uma senha. Aqui, apenas copiamos o código UsernamePasswordAthenticationToken e removemos as informações relacionadas à senha.
classe pública SMScodeAuthenticationToken estende abstrateAuthenticationToken {private estático final serialversionuid = springSecurityCoreversion.serial_version_uid; Principal de objeto final privado; public SMScodeAuthenticationToken (String Mobile) {super (null); this.principal = celular; setauthenticated (false); } public smScodeAuthenticationToken (Principal de objeto, coleção <? Extends concedida autoridade> autoridades) {super (autoridades); this.principal = principal; super.setAuthenticated (verdadeiro); // deve usar super, à medida que substituímos} public Object getCredentials () {return null; } public Object getPrincipal () {return this.principal; } public void setauthenticated (boolean isauthenticated) lança ilegalArgumentException {if (isauthenticated) {lança nova ilegalArgumentException ("não pode definir esse token para confiar - o construtor de uso que leva uma lista de autores de concessão"); } super.setAuthenticated (false); } @Override public void eraseCredentials () {super.ERASECREDENTALS (); }} AuthenticationFilter
No processo de registro na senha da conta, o padrão é UsernamePasswordAuthenticationFilter. Sua função é obter a conta e a senha da solicitação, verificar o método da solicitação e gerar um AuthenticationToken. Aqui, nossos parâmetros mudaram de uma certa maneira, por isso ainda é o método antigo, copie para fazer modificações simples
classe pública smscodeAuthenticationfilter estende abstrateAthenticationProcessingFilter {// Parâmetros de solicitação chave privada string mobileParameter = securityconstants.default_parameter_name_mobile; // é só suportado post private boolean póstonly = true; public SMScodeAuthenticationFilter () {// Solicite o URL Super da interface (novo AntPathRequestMatcher (SecurityConstants.Default_Login_Processing_URL_Mobile, "Post")); } Autenticação pública Trialenticação (solicitação httpServletRequest, httpServletResponse resposta) lança autenticaçãoException {if (postonly &&! request.getMethod (). Equals ("post") {lança a nova autenticação ("Authentication Method não apoiou:" + Solicting ". } // obtenha o valor da solicitação de acordo com o nome do parâmetro de solicitação String String Mobile = obttainMobile (solicitação); if (móvel == null) {móvel = ""; } móvel = celular.trim (); // gerar a autenticação correspondente SmScodeAuthenticationToken authRequest = new SMScodeAuthenticationToken (Mobile); setDetails (solicitação, authrequest); return this.GetauthenticationManager (). Authenticate (AuthRequest); } / *** Obtenha o número do celular* / String protegida obttainMobile (httpServletRequest Request) {return request.getParameter (mobileParameter); } // omita código irrelevante} Provedor
Durante o processo de login da senha da conta, a correção da senha e se a conta está disponível são verificadas através do DAOAuthenticationProvider. Também devemos implementar um provedor
classe pública SMScodeAuthentationProvider implementa o AuthenticationProvider {private UserDetailSService UserDetailSService; / ** * Verificação da lógica da identidade * @Param Authentication * @return * @Throws AuthenticationException */ @Override Autenticação pública Autenticação (autenticação Autenticação) lança autenticaçãoException {smscodeAuthenticationToken AuthenticationToken = (SMScodEauthenticationToken) autenticação; UserDetails user = userDetailSService.loadUserByUserName ((String) AuthenticationToken.getPrincipal ()); if (user == null) {lança new InternaThenticationServiceException ("As informações do usuário não podem ser obtidas"); } SmScodeAuthenticationToken AuthenticationResult = new SMScodeAuthenticationToken (User, user.Getathorities ()); AuthenticationResult.SetDetails (AuthenticationToken.getDetails ()); return autenticationResult; } @Override public boolean suporta (classe <?> Autenticação) {return smsCodeAuthenticationToken.class.isassignablefrom (autenticação); } public userDetailSService getUserDetailSService () {return userDetailSService; } public void setUserDetailSService (UserDetailSService UserDetailSService) {this.UserDetailSService = UserDetailSService; }} Configuração
O principal processo de autenticação é alcançado através dos quatro processos acima. Aqui podemos reduzir a configuração deles.
@ComPonentPublic Classe SMScodeAuthenticationSecurityConfig Estende o SecurityConfigureRAdApter <DefaultSecurityFilterChain, httpsecurity> {@aUTowired Private AuthenticationsUccessHandler MyAuthenticationsUcssHandler; @AUTOWIRED AUTHenticação privadaFailureHandler MyAuthenticationFailureHandler; @AUTOWIRED PRIVADO PRIVADO DE USERDETAILSERVICE USERDETAILSSERVICE; @Override public void Configure (httpsecurity http) lança exceção {smScodeAuthenticationFilter smscodeAuthenticationFilter = new smScodeAuthenticationFilter (); smscodeAuthenticationFilter.SetAuthenticationManager (http.getsharedObject (autenticaçãoManager.class)); smScodeAuthenticationFilter.SetAuthenticationsuccessHandler (MyAuthenticationsuccessHandler); smscodeAuthenticationFilter.SetAuthenticationFailureHandler (MyAuthenticationFailureHandler); SmScodeAuthentationProvider smscodeAuthenticationProvider = new SMScodeAuthenticationProvider (); smScodeAuthenticationProvider.SetUserDetailSService (UserDetailSService); http.authenticationProvider (smscodeAuthenticationProvider) .addfilterafter (smscodeAuthenticationfilter, usernamePasswordAuthenticationFilter.class); }} // BrowerSecurityconfig.java@overrideproteged void Configure (httpsecurity http) lança exceção {http.apply (smscodeAuthenticationsecurityconfig);} Download de código
Segurança da primavera
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.