In diesem Artikel wird die Spring Security OAuth2.0 eingeführt, um SMS -Beispiele für Verifizierungscode -Anmeldungen zu implementieren und sie wie folgt mit Ihnen zu teilen:
Definieren Sie Mobiltelefonnummer Anmelde -Token
/** * @Author Länge * @date 2018/1/9 * Handynummer Login Token */Public Class MobileAthenticationToken erweitert die AbstractAuthenticationToken {private statische endgültige long serialversionuid = spiningSecurityCoreversion.serial_version_uid; privates endgültiges Objekt -Schulleiter; public mobileAuthenticationToken (String Mobile) {Super (null); this.principal = mobil; setAuthenticated (falsch); } public mobileAuthenticationToken (Objekt -Prinzip, Sammlung <? Erweitert GrantedAuthority> Behörden) {Super (Behörden); this.principal = Principal; Super.setAuthenticated (wahr); } öffentliches Objekt getPrincipal () {return this.principal; } @Override öffentliches Objekt getCredentials () {return null; } public void setAuthenticated (boolean isauthenticated) löst illegalArgumentException aus {if (isauthenticated) {Wirf neu illegalArgumentException ("kann dieses Token nicht auf vertrauenswürdige Konstruktor einstellen, das stattdessen eine gewährte Authority -Liste aufnimmt"); } super.setAuthenticated (false); } @Override public void erasecredentials () {Super.eraseCredentials (); }}Logik zur Überprüfung der Mobiltelefonnummer
/** * @Author Länge * @date 2018/1/9 * Mobilfunknummer Anmeldeverifizierung Logik */öffentliche Klasse MobileAthenticationProvider implementiert Authentifizierungsprovider {private UserService UserService; @Override öffentliche Authentifizierung Authentifizierung (Authentifizierungsauthentifizierung) löst die Authentifizierungsexzeption aus {MobileAuthenticationToken MobileAthenticationToken = (MOBILEATUTHENTATETOOCK) Authentifizierung; Uservo uservo = userService.finduserByMobile ((String) mobileAthenticationToken.getprincipal ()); UserDetailSimpl UserDetails = BuildUserDeatils (UserVO); if (userDetails == null) {werfen neue interneAuthenticationServiceException ("Handynummer existiert nicht:" + MobileAthenticationToken.getprincipal ()); } MOBILEAUTHENTICATIONTOOKE AuthenticationToken = new MobileAuthenticationToken (UserDetails, userDetails.getAuthorities ()); authenticationToken.setDetails (MOBILEAUTUTICATIONTICATIONTOOKEN.getDetails ()); Return AuthenticationToken; } private userDetailSimpl BuildUserDeatils (uservo uservo) {Neue BenutzerdetailSimpl (uservo) zurückgeben; } @Override public boolean Supports (Klasse <?> Authentifizierung) {return MobileAuthenticationToken.class.IsScasssidesignableFrom (Authentifizierung); } public UserService getuSerService () {return userService; } public void setUserService (UserService UserService) {this.userService = userService; }}Anmeldungsprozessfilterverarbeitung
/** * @Author Länge * @date 2018/1/9 * Mobile Number -Anmeldeverifizierung Filter */Public Class MobileAuthenticationFilter erweitert die AbstractAuthentationsprozessingFilter {public static Final String Spring Spring_security_form_mobile_key = "Mobile"; private String mobileparameter = spring_security_form_mobile_key; privat boolean postonly = true; public mobileAuthenticationFilter () {Super (neuer AntpathequestMatcher (SecurityConstants.Mobile_Token_url, "post")); } öffentliche Authentifizierungsversuch (httpServletRequest -Anfrage, HttpServletResponse -Antwort) löst die Authentifizierung aus. } String mobile = ordneMobile (Anfrage); if (mobil == null) {mobil = ""; } mobil = mobile.trim (); MOBILEAUTUTHENTICATIONTOOKEN MOBILEATUTICATIONTOOKE = NEU MOBILEAUTUTICATIONTOOKEN (Mobile); SetDetails (Anfrage, MobileAuthenticationToken); return this.getAuthenticationManager (). authenticat (mobileAuthenticationToken); } Protected String erhaltenesMobile (httpServletRequest Request) {return request.getParameter (MobileParameter); } Protected void setDetails (httpServletRequest -Anfrage, MobileAuthenticationToken Authrequest) {Authrequest.SetDetails (AuthenticationDetailSSource.buildDetails (Anfrage)); } public void setPostonly (boolean postonly) {this.postonly = postOnly; } public String getMobileParameter () {return MobileParameter; } public void setMobileParameter (String MobileParameter) {this.mobileParameter = MobileParameter; } public boolean ispostonly () {postonly zurückgeben; }}Produktionstoken Standort
/** * @Author Länge * @date 2018/1/8 * Die Mobiltelefonnummer ist erfolgreich und gibt oAuth token */ @componentpublic Class MobileloginSuccessHandler implementiert org.springframework @Autowired Private ObjectMapper ObjectMapper; @Autowired Private ClientDetailsService ClientDetailsService; @Autowired Private AuthorizationServertokenServices AuthorizationServertokenServices; @Override public void onAuthentications -uccess (httpServletRequest Request, httpServletResponse -Antwort, Authentifizierungsauthentifizierung) {String Header = Request.Getheader ("Autorisierung"); if (header == null ||! header } try {string [] tokens = extractandDecodeHeader (Header); assert tokens.length == 2; String clientID = Tokens [0]; String ClientSecret = Tokens [1]; JsonObject params = new JsonObject (); params.put ("clientID", clientID); params.put ("ClientSecret", Clientcret); params.put ("Authentifizierung", Authentifizierung); ClientDetails clientDetails = clientDetailsService.loadClientByClientID (clientID); TokenRequest tokenRequest = new tokenRequest (maputil.newhashMap (), clientid, clientDetails.getScope (), "mobil"); OAuth2Request oAuth2Request = tokenRequest.createoAuth2Request (ClientDetails); OAuth2Authentication oAuth2Authentication = new OAuth2Authentication (OAuth2Request, Authentifizierung); OAuth2AccessToken OAuth2AccessToken = AuthorizationServertokenServices.CreateAccessToken (OAuth2Authentication); logger.info ("Get Token Erfolg: {}", oAuth2accessToken.getValue ()); response.setcharactercoding (CommonConstant.utf8); response.setContentType (CommonConstant.Content_type); Printwriter printwriter = Antwort.getWriter (); Printwriter.Append (ObjectMapper.WriteValuEasString (oAuth2AccessToken)); } catch (ioException e) {neue badcredentialSexception werfen ("" Basic Authentication Token nicht entschlüsselt "); }} /*** decodiert den Header in einen Benutzernamen und ein Passwort. * * @throws badcredentialSexception Wenn der Basis-Header nicht vorhanden ist oder nicht gültig ist Byte [] decodiert; try {decoded = base64.Decode (Base64Token); } catch (illegalArgumentException E) {neue badcredentialSexception werfen ("" Basic Authentication Token nicht entschlüsselt "); } String token = new String (decodiert, CommonConstant.utf8); int delim = token.indexof (":"); if (delim == -1) {neue badcredentialSexception werfen ("Ungültiges grundlegendes Authentifizierungs -Token"); } return New String [] {token.substring (0, delim), token.substring (delim + 1)}; }}Konfigurieren Sie die obige Anpassung
// ** * @Author Länge * @date 2018/1/9 * Mobile Number -Login -Konfigurationsportal */ @componentpublic class MobileSecurityConFigurer erweitert SecurityConFigurerAdapter <defaultSecurityFilterchain, htttpsecurity> {@autuned private mobileloginucesshandler mounteloginuccesshandler; @Autowired Private UserService UserService; @Override public void configure (httpecurity http) löst Ausnahme aus {MobileAuthenticationFilter MobileAuthenticationFilter = new MobileAuthenticationFilter (); MOBILEAUTHENTICATIONFILTER.SETAUTHENTICATIONMANAGER (http.getSharedObject (AuthenticationManager.Class)); MobileAuthenticationFilter.SetAuthenticationsCessHandler (MobileloginSuccessHandler); MOBILEAUTUTHENTICATIONPROVIDER MOBILEATUTHENTICATIONPROVIDER = NEU MOBILEAUTHENTICATIONPROVIDER (); MobileAuthenticationProvider.SetUserService (UserService); http.authenticationProvider (MobileAuthenticationProvider) .AddFilterAfter (MobileAuthenticationFilter, usernamePasswordAuthenticationFilter.class); }}Die aggregierte Konfiguration, die oben der Federsicherheitskonfiguration angegeben ist
/** * @author length * @date January 9, 2018 14:01:25 * Authentication server open interface configuration*/@Configuration@EnableResourceServerpublic class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { @Autowired private FilterUrlsPropertiesConifg filterUrlsPropertiesConifg; @Autowired Private MobileSecurityConfigurer MOLIRESECURITYCONFIGUR; @Override public void configure (httpecurity http) löst eine Ausnahme aus (Registry .antMatchers ("/mobil/token"). http.apply (MobileSecurityConfiger); }}verwenden
Die Codekopie lautet wie folgt:
curl -h "Autorisierung: Basic cglnonbpzw ==" -d "Grant_type = mobile & scope = server & mobile = 17034642119 & code =" http: // localhost: 9999/auth/mobil/token
Quellcode
Weitere Informationen finden Sie unter gitee.com/log4j/
Basierend auf Spring Cloud und Spring Security OAuth2.0 werden Authentifizierung und Autorisierung auf Unternehmensebene entwickelt und bieten eine gemeinsame Serviceüberwachung, Linkverfolgung, Protokollanalyse, Cache-Management, Aufgabenplanung und andere Implementierungen
Die gesamte Logik wird im Anmeldungsmodus usernamePassword der Spring Security implementiert und Sie können den Quellcode verweisen.
Die Logik der Ausstellung und Überprüfung von Überprüfungscodes ist relativ einfach. Verwenden Sie nach der Methode den globalen Monteur, um festzustellen, ob der Code in der Anforderung mit der Mobiltelefonnummer übereinstimmt. Die Schlüssellogik sind die Parameter des Tokens.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.