В этой статье представлены Spring Security OAuth2.0 для реализации примеров входа в код проверки SMS и поделиться ими с вами следующим образом:
Определите токен для входа в систему мобильного телефона
/** * @author длина * @date 2018/1/9 * Token number № */Public Class MobileAuthenticationtoken Extables AbstractauthenticationToken {Private Static Long Long SerialVersionUID = SpringSecurityCoreversion.serial_version_uid; частная конечная цель; public MobileAuthenticationToken (String Mobile) {super (null); this.principal = мобильный; setAuthenticated (false); } public MobileAuthenticationToken (объект Принципал, Collection <? Extends wreatedAuthority> власти) {super (власти); this.principal = Принципал; Super.Setauthaticed (true); } public Object getPrincipal () {return this.principal; } @Override public object getCredentials () {return null; } public void setAuthenticated (boolean isauthenticated) Throws OldalArgumentException {if (isauthenticated) {бросить новый allosalargumentException («не может установить этот токен доверенному - использовать конструктор, который занимает вместо этого список wrestauthority»); } super.setauthaticated (false); } @Override public void erasecredentials () {super.erasecredentials (); }}Номер мобильного телефона Логика проверки проверки
/** * @Author Length * @Date 2018/1/9 * Логика проверки номера мобильного телефона */public Class MobileAuthenticationProvider реализует аутентификацию provider {private userservice userservice; @Override публичная аутентификация аутентификации (аутентификация аутентификации) выбрасывает аутентификацию Exception {MobileAuthenticationToken MobileAuthenticationToken = (MobileAuthenticationToken) Аутентификация; Uservo uservo = userservice.finduserbymobile ((String) MobileAuthenticationToken.getPrincipal ()); UserDetailSimpl userDetails = bulteruserDeatils (uservo); if (userdetails == null) {бросить новый internalauthenticationserviceexception («Номер мобильного телефона не существует:» + mobileauthenticationtoken.getPrincipal ()); } MobileAuthenticationToken AuthenticationToken = new MobileAuthenticationToken (userDetails, userDetails.getAuthorities ()); AuthenticationToken.setDetails (MobileAuthenticationToken.getDetails ()); вернуть аутентификацию; } private userDetailSimpl BuildUserDeatils (USERV USERVO) {return new userDetailSimpl (uservo); } @Override public boolean поддерживает (класс <?> Аутентификация) {return mobileAuthenticationtoken.class.isassignablefrom (аутентификация); } public userservice getUserservice () {return userservice; } public void setUserService (userservice userservice) {this.userService = userservice; }}Обработка фильтра в процессе входа в систему
/** * @author Length * @Date 2018/1/9 * Фильтр проверки номера мобильного телефона */Public Class MobileAuthenticationFilter ExtrableAuthenticationProcessingFilter {public Static Final String Spring_security_form_mobile_key = "Mobile"; Приватная строка MobileParameter = Spring_Security_form_mobile_key; Частный логический Postonly = true; public mobileauthenticationfilter () {super (новый antpathrequestmatcher (securityconstants.mobile_token_url, "post")); } public Authentication попытка овладения (запрос httpservletrequest, httpservletresponse response) throws authenticationexception {if (postonly &&! request.getmethod (). equals (httpmethod.post.name ())) {выбросить новую аутентификацию (httpmethod.post.name ())) {выбросить новую аутентификацию (httpmethod.post.name ())). } String mobile = eaveMobile (запрос); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); MobileAuthenticationToken MobileAuthenticationToken = new MobileAuthenticationToken (Mobile); SetDetails (запрос, MobileAuthenticationToken); вернуть это. GetAuthenticationManager (). Authenticate (MobileAuthenticationToken); } защищенная строка optedMobile (httpservletrequest) {return request.getParameter (mobileParameter); } Protected void setDetails (httpservlectrequest, MobileAuthenticationToken Authrequest) {Authrequest.SetDetails (AuthenticationDetailsSource.BuildDetails (запрос)); } public void setPostonly (boolean postonly) {this.postonly = postonly; } public String getMobileParameter () {return mobileParameter; } public void setMobileParameter (String mobileParameter) {this.mobileparameter = mobileParameter; } public boolean ispostonly () {return postonly; }}Расположение токена производства
/** * @author Length * @Date 2018/1/8 * Вход в мобильный номер телефона успешен и возвращает токен OAuth */ @componentPublic Class MobileLogInsuccessHandler внедряет org.springframework.security.web.Authentication.AuthenticationCshessHandler {private LoggerScrectory.getClegger (gate); @Autowired Private ObjectMapper ObjectMapper; @Autowired Private ClientDetailsService ClientDetailsService; @Autowired Private AuthorizationserTokenServices AutorrizationserTortOkenServices; @Override public void onAuthenticationAccesscess (httpservletrequest, httpservletresponse, ответ аутентификации) {string header = request.getheader ("Authorization"); if (header == null ||! header.startswith ("basic"))) {бросить новый не одобренный clientAuthenticationException ("Информация о клиенте в заголовке запроса пуста"); } try {string [] tokens = ExtractAndDecodeHeader (заголовок); Assert tokens.length == 2; String clientId = tokens [0]; String clientsecret = tokens [1]; JsonObject params = new jsonObject (); params.put ("clientId", clientId); params.put ("clientsecret", clientsecret); params.put («аутентификация», аутентификация); ClientDetails ClientDetails = ClientDetailsService.loadClientByClientId (ClientId); TokenRequest tokenRequest = new TokenRequest (maputil.newhashmap (), clientId, clientDetails.getScope (), "mobile"); Oauth2request oauth2request = tokenRequest.createoAuth2Request (clientDetails); Oauth2authentication oauth2authentication = новая oauth2authentication (oauth2request, аутентификация); Oauth2accesstoken oauth2accesstoken = AuthorizationServertOkenServices.CreateAccessToken (OAuth2Authentication); logger.info ("Get Token Success: {}", oauth2accesstoken.getValue ()); response.setcharacterencoding (commonconstant.utf8); response.setContentType (commonconstant.content_type); PrintWriter PrintWriter = response.getWriter (); printwriter.append (objectmapper.writevalueasstring (oauth2accesstoken)); } catch (ioException e) {бросить новый BadcredentialSexception («Не удалось декодировать основной токен аутентификации»); }} /*** Декодирует заголовок в имя пользователя и пароль. * * @Throws BADCREDENTIALSEXCEPTION Если основной заголовок отсутствует или не является действительным * BASE64 */ Private String [] ExtractAndDecodeHeader (заголовок строки) бросает ioException {byte [] base64token = header.substring (6) .getBytes ("utf-8"); байт [] декодирован; try {decoded = base64.decode (base64token); } catch (allogalargumentException e) {бросить новый BadcredentialSexception («Не удалось декодировать основной токен аутентификации»); } String token = new String (decoded, commonconstant.utf8); int delim = token.indexof (":"); if (delim == -1) {бросить новый badcredentialsexception («Неверный токен основной аутентификацию»); } вернуть новую строку [] {token.substring (0, delim), token.substring (delim + 1)}; }}Настройка вышеуказанной настройки
// ** * @author Length * @Date 2018/1/9 * Портал настройки номера мобильного телефона */ @componentPublic Class MobileCurityConfigurer Extends SecurityConfigurerAdapter <defaultsecurityfilterChain, httpsecurity> {@autowworired MobileLoginSuccesshessHandler MobileLoginSuction> @Autowired private userservice userservice; @Override public void configure (httpsecurity http) выбрасывает исключение {mobileauthenticationfilter mobileauthenticationfilter = new MobileAuthenticationFilter (); MobileAuthenticationFilter.setAuthenticationManager (http.getsharedObject (authenticationManager.class)); MobileAuthenticationFilter.SetauthenticationSuccessHandler (MobileLoginSuccessHandler); MobileAuthenticationProvider MobileAuthenticationProvider = new MobileAuthenticationProvider (); MobileAuthenticationProvider.SetUserService (userService); http.authenticationprovider (MobileAuthenticationProvider) .AddFilterAfter (MobileAuthenticationFilter, usernamepasswordAuthenticationfilter.class); }}Конфигурация агрегата, указанная выше конфигурации безопасности пружины
/** * @Author Length * @Date 9 января 2018 г. 14:01:25 * Сервер аутентификации открытая интерфейс */ @configuration @enablerSourceserPublic Class ResourceserverConfiguration Extrends resourceServerConfigurerAdapter {@autowired privatempertsproperteconconferteconconifgeconconifgeconconifgeconconifgeconconifggeconconifgeconconifgenifgeconconfercenifgeconconferceconconifgeconconfercenifgeconconifgenifgenifgeconconifgg @Autowired Private MobilesecurityConfigurer MobilesecurityConfigurer; Public void configure (httpsecurity http) бросает исключение {реестр .antmatchers ("/mobile/token"). Rescissionall (). AnyRequest (). Authenticated (). И () .csrf (). Divable (); http.Apply (мобильный размерконфигур); }}использовать
Кода -копия выглядит следующим образом:
curl -h "Авторизация: базовый cglnonbpzw ==" -d "grant_type = mobile & scope = server & mobile = 17034642119 & code =" http: // localhost: 9999/auth/mobile/token
Исходный код
Пожалуйста, обратитесь к gitee.com/log4j/
Основываясь на Spring Cloud и Spring Security OAuth2.0, разработана аутентификация и авторизация на уровне предприятия, обеспечивая общий мониторинг обслуживания, отслеживание ссылок, анализ журналов, управление кэшами, планирование задач и другие реализации
Вся логика реализована в режиме входа в систему Usernamepassword Sepring Security, и вы можете обратиться к его исходному коду.
Логика выпуска и проверки кодов проверки относительно проста. После метода используйте Global Fitter, чтобы определить, соответствует ли код в запросе номер мобильного телефона. Ключевая логика - это параметры токена.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.