Принцип реализации
В предыдущих статьях мы представили метод входа в систему с обычными паролями учетной записи: Springboot + Spring Security Basic Использование и персонализированная конфигурация входа в систему. Но сейчас есть еще один общий способ, который должен войти непосредственно через код проверки SMS вашего мобильного телефона. Здесь вам нужно сделать дополнительную работу самостоятельно.
Любой, у кого есть определенное понимание подробного объяснения процесса аутентификации Springsecurity, знает, что в процессе аутентификации пароля учетной записи участвуют следующие категории: usernamepasswordAuthenticationFilter (используется для запроса внедрения параметров), usernamepasswordAuthenticationToken (представляет информацию о регистрации пользователя), для аутентификации), проверка аутентификации), проверка аутентификации), проверка аутентификации), проверка аутентификации)
Поскольку он входит в систему через код проверки SMS, нам необходимо переписать запрошенные параметры, процесс аутентификации и информацию о токене для входа в систему для определенной суммы.
Конечно, сначала мы должны поместить процесс кода проверки, если графическая проверка внедрена так же. Преимущество этого подхода состоит в том, что процесс аутентификации кода проверки отделен, так что можно также использовать другие интерфейсы.
Основная реализация
Проверка кода проверки
Функциональная реализация кода проверки SMS на самом деле совпадает с принципом кода графической проверки. Просто один должен вернуть изображение на переднюю часть, а другой - отправить пользователю короткое сообщение. Здесь вам просто нужно позвонить в интерфейс поставщика услуг SMS. Для получения дополнительных принципов, пожалуйста, обратитесь к Springboot + Springsecurity, чтобы реализовать функцию кода графического проверки.
Аутентификация
При входе в систему с паролем вашей учетной записи, UsernamepassWordAuthenticationToken содержит учетную запись, пароль и другую информацию о статусе, например, доступна ли она. Мы входим через SMS на мобильном телефоне, поэтому у нас нет пароля. Здесь мы просто скопируем код пользователя usernamepasswortenticationtoken и удаляем связанную с паролем информацию.
открытый класс smscodeauthenticationtoken extends AbstractAuthenticationToken {private Static Long Long SerialVersionUID = SpringsecurityCoreversion.serial_version_uid; частная конечная цель; public smscodeauthenticationtoken (String mobile) {super (null); this.principal = мобильный; setAuthenticated (false); } public smscodeauthenticationtoken (объект Принципал, Коллекция <? Расширение wreatedAuthority> власти) {super (власти); this.principal = Принципал; Super.Setauthaticed (true); // должен использовать Super, как мы переопределяем} public Object getCredentials () {return null; } public Object getPrincipal () {return this.principal; } public void setAuthenticated (boolean isauthenticated) Throws OldalArgumentException {if (isauthenticated) {бросить новый allosalargumentException («не может установить этот токен доверенному - использовать конструктор, который занимает вместо этого список wrestauthority»); } super.setauthaticated (false); } @Override public void erasecredentials () {super.erasecredentials (); }} Аутентификацияфильтер
В процессе входа в пароль учетной записи по умолчанию - UsernamepassWordAuthenticationFilter. Его функция состоит в том, чтобы получить учетную запись и пароль из запроса, проверить метод запроса и генерировать аутентификацию. Здесь наши параметры изменились определенным образом, так что это старый метод, копируйте, чтобы внести простые изменения
открытый класс smscodeauthenticationfilter extends AbstractAuthenticationProcessingFilter {// запрос параметров ключа частной строки MobileParameter = SecurityConstants.default_parameter_name_mobile; // Это только поддерживается Post Private Boolean Postonly = true; public smscodeauthenticationfilter () {// запросить URL -адрес интерфейса (новый antpathrequestmatcher (securityConstants.default_login_processing_url_mobile, "post")); } Общественная попытка аутентификации Outhutentication (httpservlectrequest, httpservletresponse response) throws authenticationexception {if (postonly &&! request.getmethod (). equals ("post")) {throw new authenticationserviceexception ("метод аутентификации не поддерживается:" + request.getmethod (); } // Получить значение запроса в соответствии с именем параметра запроса string mobile = eavemobile (request); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); // генерировать соответствующую аутентификацию smscodeauthenticationtoken authrequest = new smscodeauthenticationtoken (mobile); SetDetails (запрос, Authrequest); вернуть this.getAuthenticationManager (). Authenticate (Authrequest); } / *** Получить номер мобильного телефона* / Защищенная строка eaffmobile (httpservlectrequest) {return request.getParameter (mobileParameter); } // Опустить нерелевантный код} Поставщик
Во время процесса входа в систему пароля учетной записи правильность пароля и доступна ли учетная запись проверена через DaoAuthenticationProvider. Мы также должны реализовать поставщика
открытый класс smscodeauthentication provider реализует аутентификацию provider {private userdetailsservice userdetailsservice; / ** * Идентификационная проверка логики * @param аутентификация * @return * @throws authenticationexception */ @override public authentication authentication (аутентификация аутентификации) Throws AuthenticationException {smscodeauthenticationtoken AuthenticationToken = (smscodeauthenticatogen) authuentication; Userdetails user = userdetailsservice.loaduserbyusername ((string) authenticationtoken.getPrincipal ()); if (user == null) {бросить новый InternalAuthenticationserviceException («Пользовательская информация не может быть получена»); } Smscodeauthenticationtoken AuthenticationResult = новый smscodeauthenticationToken (user, user.getauthorities ()); AuthenticationResult.setDetails (AuthenticationToken.getDetails ()); вернуть аутентификацию } @Override public boolean поддерживает (класс <?> Аутентификация) {return smscodeauthenticationtoken.class.isassignablefrom (аутентификация); } public userDetailsService getUserDetailsService () {return userDetailsService; } public void setUserDetailsService (userDetailsService userDetailsService) {this.UserDetailsService = userDetailsService; }} Конфигурация
Основной процесс аутентификации достигается в результате четырех вышеуказанных процессов. Здесь мы можем уменьшить их конфигурацию.
@Componentpublic class smscodeauthenticationsecurityconfig расширяет SecurityConfigurerAdapter <defaultsecurityfilterchain, httpsecurity> {@autowired Private AuthenticationCessCessHandler MyAuthenticationActionCessHandler; @Autowired Private AuthenticationFailureHandler myauthenticationFailureHandler; @Autowired private userdetailsservice userdetailsservice; @Override public void configure (httpsecurity http) бросает исключение {smscodeauthenticationfilter smscodeauthenticationfilter = new SmscodeauthenticationFilter (); smscodeauthenticationfilter.setauthenticationManager (http.getsharedObject (authentication manage.class)); smscodeauthenticationfilter.setauthenticationsuccessHandler (MyAuthenticationAccessHandler); smscodeauthenticationfilter.setauthenticationfailureHandler (myauthenticationFailureHandler); Smscodeauthenticationprovider smscodeauthentication provider = new smscodeauthenticationprovider (); smscodeauthenticationprovider.setuserDetailsService (userDetailsService); http.authenticationprovider (smscodeauthenticationprovider) .AddFilterAfter (smscodeauthenticationfilter, usernamepasswordauthenticationfilter.class); }} // browersecurityconfig.java@overrideprotected void configure (httpsecurity http) выбрасывает исключение {http.apply (smscodeauthenticationsecurityconfig);} Код скачать
Весенняя безопасность
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.