Classificação de uso de segurança da primavera:
Acredito que todos que viveram em Baidu sabem como usar a segurança da primavera. Existem quatro usos, do simples ao profundo:
1. Nenhum banco de dados é usado, todos os dados são gravados no arquivo de configuração, que também é uma demonstração no documento oficial;
2. Use o banco de dados e implemente o design de código padrão do banco de dados de acordo com a Spring Security, o que significa que o banco de dados foi corrigido, esse método é inflexível e o banco de dados é projetado muito simples e tem baixa praticidade;
3. A segurança da primavera é diferente da ACEGI. Ele não pode mais modificar o filtro padrão, mas suporta a inserção de filtros; portanto, com base nisso, podemos inserir nossos próprios filtros para uso flexível;
4. Violento significa modificar o código -fonte. A modificação do filtro padrão mencionado acima é apenas para modificar o arquivo de configuração para substituir o filtro. Isso altera diretamente o código -fonte interno, mas isso não está em conformidade com o princípio do design OO e não é prático e indisponível.
Este artigo apresenta principalmente conteúdo relevante sobre o login de autenticação personalizado da Spring Security. É compartilhado para sua referência e aprendizado. Não vou dizer muito abaixo. Vamos dar uma olhada na introdução detalhada juntos.
1. Resumo
1.1. Introdução
A Spring Security é uma estrutura de segurança baseada nos filtros da Spring AOP e Servlet para gerenciar a autenticação de permissão, etc.
1.2. Processo de autenticação personalizada de segurança da prole
1) Processo de autenticação
Gerar autenticação não autenticada
↑ (Get Informações) (Atribua provedores de acordo com AuthenticationToken) AuthenticationFilter -> AuthenticationManager -> AuthenticationProvider ↓ (Autenticação) UserDetails (Aquisição de Database Geral de Consulta) ↓ (PASS) Gere AuthenticationToken que foi autenticado com sucesso ório (armazenamento) SecurityCotextolder
2) Adicione o AuthenticationFilter à cadeia de filtros de segurança (configurada no servidor de recursos), como:
http.addfilterbe antes (autenticaçãofilter, abstratePreauthenticatedprocessingFilter.class)
ou:
http.addfilterafter (AuthenticationFilter, UsernamePasswordAthenticationFilter.class)
2. Pegue o login do SMS como um exemplo
2.1. Ambiente de Desenvolvimento
2.2. Análise de código central
2.2.1. Processo de autenticação de login personalizado
2.2.1.1. Token de login de autenticação personalizado
/** * Token de login móvel * * @Author: Catalpaflat */public classe mobileloginauthentication estende abstrateAuthenticationToken {private estático final serialversionuid = springSecurityCoreversion.serial_version_uid; Logger final estático privado) = LoggerFactory.getLogger (mobileLoginauthenticationToken.class.getName ()); Principal de objeto final privado; public mobileloginauthenticationToken (String mobile) {super (null); this.principal = celular; this.setAuthenticated (false); Logger.info ("mobileloginauthenticationToken setauthenticated -> Falso Carregando ..."); } public mobileLoginauthenticationToken (Principal de objeto, coleção <? Extende a autoridade concedida> autoridades) {super (autoridades); this.principal = principal; // deve usar super, pois substituímos super.setAuthenticated (true); Logger.info ("mobileloginauthenticationToken setauthenticated -> carregamento verdadeiro ..."); } @Override public void setauthenticated (boolean autenticado) {if (autenticado) {lança new ilegalArgumentException ("não pode definir esse token para o construtor de uso confiável, que leva uma lista de autenticação concedida"); } super.setAuthenticated (false); } @Override Public Object getCredentials () {return null; } @Override Public Object getPrincipal () {return this.Principal; } @Override public void eraseCredentials () {super.ERASECREDENTALS (); }} Observação:
setauthenticated (): determina se foi autenticado
2.2.1.1. Filtro de login de autenticação personalizado
/** * Filtro de login do Mobile SMS * * @Author: Catalpaflat */classe pública mobileloginauthenticationfilter estende abstrateAthenticationProcessingFilter {private boolean pós -° = true; Logger final estático privado) = LoggerFactory.getLogger (mobileloginauthenticationfilter.class.getName ()); @Getter @setter Private String mobileParametername; public mobileloginauthenticationfilter (String mobileLoginurl, string mobileParametername, string httpmethod) {super (novo anti -pathrequestMatcher (mobileLoginurl, httpmethod)); this.MobileParametername = MobileParameterName; Logger.info ("Mobileloginauthenticationfilter carregando ..."); } @Override Autenticação pública Tenticação de autenticação (solicitação httpServletRequest, httpServletResponse) lança autenticaçãoException, ioexception, servletexception {if (postonly &&! Request.getMethod (). Equals (httpmethod.post.name () () não. request.getMethod ()); } // Obter String Mobile Mobile = obttainMobile (request); // montar token mobileloginauthenticationToken authRequest = new MobileloginauthenticationToken (Mobile); // permite que as subclasses defina os "Detalhes" da propriedade SetDetails (request, authrequest); return this.GetauthenticationManager (). Authenticate (AuthRequest); } / *** Detalhes para definir a autenticação de identidade* / private void SetDetails (solicitação httpServletRequest, mobileLoginauthenticationToken authRequest) {authrequest.setDetails (autenticaçãoDetailSource.buildDetails (request)); } / *** Obtenha o número do celular* / String privada obttainMobile (httpServletRequest Request) {return request.getParameter (mobileParametername); } public void setPostonly (boolean pós -{this.postonly = postonly; }}NOTA: Método Tryauthentication ():
2.2.1.1. Provedor de login de autenticação personalizado
/** * Provedor de autenticação de login de SMS móvel * * @Author: Catalpaflat */public class MobileloginauthenticationProvider implementa autenticationProvider {private estático final logger = LoggerFactory.getLogger (mobileLoginauthenticationProvider.class.getName (); @Getter @setter private userDetailSservice CustomUserDetailSService; public mobileloginauthenticationProvider () {Logger.info ("MobileloginauthenticationProvider carregando ..."); } /*** Autenticação* /@Override Autenticação pública Autenticação (autenticação Autenticação) lança autenticação de autenticação {// Obtenha as informações do token encapsuladas pelo filtro mobileLoginauthenticationToken AuthenticationToken = (MobileLoginauthenticationToken) Authentication; // Obtenha informações do usuário (autenticação do banco de dados) userDetails userDetails = CUSDIDADEDERDETAILSSERVICE.OLLOUBSERBYUSERNONE ((String) autenticationToken.getPrincipal ()); // não foi aprovado if (userDetails == null) {lança new InternaThenticationServiceException ("Não é possível obter informações do usuário"); } // por mobileloginauthenticationToken AuthenticationResult = new MobileloginauthenticationToken (userDetails, userDetails.getAuthorities ()); AuthenticationResult.SetDetails (AuthenticationToken.getDetails ()); return autenticationResult; } / ** * De acordo com o tipo de token, determine qual provedor usar * / @override public boolean suporta (classe <?> Autenticação) {return mobileLoginauthenticationToken.class.isassignablefrom (autenticação); }}Nota: Método autenticate ()
2.2.1.1. Configuração de autenticação de autenticação personalizada
@Configuratury (springbeannameconstant.default_custom_mobile_login_authentication_security_config_bn) classe public mobileLoginauthenticationsecurityConfig Extende a segurança do SecurityAdapter <DefulSecurityFiltergerger, HttpSecurity> Log Stoptiction LoggerFactory.getLogger (mobileloginauthenticationsecurityconfig.class.getName ()); @Value ("$ {Login.mobile.url}") private string defaultMobileloginurl; @Value ("$ {Login.mobile.parameter}") private string defaultMobilEloginParameter; @Value ("$ {Login.mobile.httpmethod}") private string defaultMobilelogInHttpMethod; @AUTowired Private CustomymlConfig CustomyMlConfig; @AUTOWIRED PRIVADO PRIVADO DE USERDETAILSSERVICE CustomUserDetailSService; @Autowired Authentications Private AutomenticationHandler CustomAtHenticationsUccessHandler; @AUTOWIRED AUTHenticação privadaFailureHandler CustomAthenticationFailureHandler; public mobileloginauthenticationsecurityConfig () {Logger.info ("MobileloginauthenticationSecurityConfig Loading ..."); } @Override public void Configure (httpsecurity http) lança exceção {mobilepojo móvel = customymlconfig.getlogins (). GetMobile (); String url = móvel.geturl (); String parameter = móvel.getParameter (). GetMobile (); String httpmethod = móvel.gethttpMethod (); MobileloginauthenticationFilter mobileloginauthenticationfilter = new MobileloginauthenticationFilter (stringutils.isblank (url)? DefaultMobileloginurl: url, stringutils.isblank (parameter)? defaultMobilELOGINHTTPMETHOD: httpMethod); mobileloginauthenticationfilter.setAuthenticationManager (http.getsharedObject (autenticationManager.class)); mobileloginauthenticationfilter.setAuthenticationsuccessHandler (customiathenticationsuccessHandler); mobileloginauthenticationfilter.setAuthenticationFailureHandler (customAuthenticationFailureHandler); MobileloginauthenticationProvider mobileloginauthenticationProvider = new MobileloginauthentationProvider (); mobileloginauthenticationProvider.setCustomUserDetailSService (CUNDARUSERDETAILSSERVICE); http.authenticationProvider (mobileloginauthenticationProvider) .addfilterafter (mobileloginauthenticationfilter, usernamePasswordAthenticationFilter.class); }}Nota: Método Configure ()
AuthenticationFilter instanciado e autenticação
Adicione AuthenticationFilter e AuthenticationProvider ao Spring Security.
2.2.2. Verifique o código de verificação personalizado com base no Redis
2.2.2.1. Filtro de código de verificação personalizado com base em redis
/** * filtro de código de verificação * * @Author: catalpaflat */ @componente (springbeannameconstant.default_validate_code_filter_bn) public valdalatecodeFilter. @AUTowired Private CustomymlConfig CustomyMlConfig; @Autowired Private Redistemplate <Object, Object> Redistemplate; / *** Classe de ferramenta que verifica se o URL solicitado corresponde ao URL configurado*/ private AntPathMatcher PathMatcher = new AntPathMatcher (); public validateCodeFilter () {logger.info ("Carregando validateCodeFilter ..."); } @Override Protected void DofilterInternal (solicitação HttpServletRequest, resposta httpServletResponse, filtragem de filtro) lança servletexception, ioexception {string url = alfabetizeymlconfig.getlogins (). GetMobile (). if (pathmatcher.match (url, request.getRequesturi ())) {string deviceId = request.getheader ("deviceId"); if (stringUtils.isblank (deviceId)) {tiro a nova customexception (httpstatus.not_acceptable.value (), "não deviceId na cabeça da solicitação"); } String codeParamName = CustomyMlConfig.getLogins (). GetMobile (). GetParameter (). GetCode (); String code = request.getParameter (codeParamname); if (stringutils.isblank (code)) {tire nova customexception (httpstatus.not_acceptable.value (), "não codifica os parâmetros da solicitação"); } String key = SystemConstant.Default_Mobile_Key_Pix + DeviceId; Smscodepo smscodepo = (smscodepo) redistemplate.opsforValue (). Get (chave); if (smscodepo.iseXIPID ()) {Throw New Customexception (httpstatus.bad_request.value (), "o código de verificação expirou"); } String smscode = smscodepo.getCode (); if (stringUtils.isblank (smscode)) {tiro a nova customexception (httpstatus.bad_request.value (), "o código de verificação não existe"); } if (stringutils.equals (código, smscode)) {redistemplate.delete (key); // Let It Go FilterChain.dofilter (solicitação, resposta); } else {lança a nova customexception (httpstatus.bad_request.value (), "Código de validação está incorreto"); }} else {// Deixe -o ser filtrhain.dofilter (solicitação, resposta); }}}Nota: Dofilterinternal ()
Verificação do filtro de código de verificação personalizado
2.2.2.2. Adicionar filtro de código de verificação personalizado à cadeia de filtro de segurança da primavera
http.addfilterbe antes (validateCodeFilter, abstratePreauthenticatedProcessingFilter.class)
Nota: Antes de adicionar ao filtro de pré -processamento de autenticação
3. Teste o efeito
Finalmente, o endereço do código -fonte está anexado: https://gitee.com/catalpaflat/springsecurity.git (download local)
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.