Весенняя классификация использования безопасности:
Я считаю, что каждый, кто жил в Байду, знает, как использовать весеннюю безопасность. Есть четыре использования, от простого до глубокого:
1. База данных не используется, все данные записываются в файле конфигурации, что также является демонстрацией в официальном документе;
2. Используйте базу данных и реализуйте дизайн кода по умолчанию базы данных в соответствии с Spring Security, что означает, что база данных была исправлена, этот метод негибкий, а база данных разработан очень проста и имеет плохую практичность;
3. Spring Security отличается от Acegi. Он больше не может изменять фильтр по умолчанию, но поддерживает вставку фильтров, поэтому, основываясь на этом, мы можем вставить наши собственные фильтры для гибкого использования;
4. насильственные средства для изменения исходного кода. Модификация фильтра, упомянутого выше по умолчанию, заключается в том, чтобы изменить файл конфигурации для замены фильтра. Это напрямую меняет исходный код внутри, но это не соответствует принципу дизайна OO и не является практичным и недоступным.
В этой статье в основном представлены соответствующий контент о входе в систему аутентификации Spring Security. Это обменивается вашей ссылкой и обучением. Я не скажу многое ниже. Давайте посмотрим на подробное введение вместе.
1. Резюме
1.1. Введение
Spring Security - это структура безопасности на основе Spring AOP и фильтров сервлета для управления аутентификацией разрешений и т. Д.
1.2.Spring Security Security Custom Authentication Процесс аутентификации
1) Процесс аутентификации
Генерируйте неаутентированную аутентификацию
↑ (Получить информацию) (назначить поставщиков в соответствии с аутентификацией) AuthenticationFilter -> AuthenticationManager -> AuthenticationProvider ↓ (аутентификация) UserDetails (Общее приобретение базы данных запросов) ↓ (Pass).
2) Добавить AuthenticationFilter в цепочку фильтра безопасности (настроенная на сервере ресурсов), например:
http.addfilterbefore (AuthenticationFilter, AbstractPreauthitedcocecessingFilter.class)
или:
http.addfilterafter (AuthenticationFilter, UsernamepasswordAuthenticationFilter.class)
2. Взять SMS -логин в качестве примера
2.1. Среда развития
2.2. Анализ базового кода
2.2.1. Пользовательский процесс аутентификации входа в систему
2.2.1.1. Пользовательский токен входа в систему аутентификации
/** * Токен для входа в систему * * * @author: catalpaflat */public class mobileloginauthenticationtoken extrables AbstractauthenticationToken {Private Static Long Long SerialVersionuid = SpringSecurityCoreversion.serial_version_uid; Private Static Final Logger logger = loggerFactory.getLogger (mobileLoginauthenticationToken.class.getName ()); частная конечная цель; public mobileLoginauthenticationToken (String Mobile) {super (null); this.principal = мобильный; this.setauthaticed (false); logger.info ("MobileLoginauthenticationToken setAuthenticated -> false загрузка ..."); } public mobileLoginauthenticationToken (объект Принципал, Коллекция <? Расширение wreatedAuthority> власти) {super (власти); this.principal = Принципал; // должен использовать Super, как мы переопределяем Super.Setauthenticated (true); logger.info ("MobileLoginaThenticationToken setAuthenticated -> true загрузка ..."); } @Override public void setAuthenticated (boolean authenticated) {if (authenticated) {бросить новый allosalargumentException («не может установить этот токен доверенному - используйте конструктор, который принимает список предоставленных факторов» вместо этого »); } super.setauthaticated (false); } @Override public object getCredentials () {return null; } @Override public Object getPrincipal () {return this.principal; } @Override public void erasecredentials () {super.erasecredentials (); }} Примечание:
setAuthenticated (): определяет, был ли он аутентифицирован
2.2.1.1. Пользовательский фильтр входа в систему аутентификации
/** * Mobile SMS Login Filter * * @author: CatalPaflat */Public Class MobileLoginauthenticationFilter Extrable AbstractAuthenticationProcessingFilter {Private Boolean Postonly = true; Private Static Final Logger logger = loggerFactory.getLogger (MobileLoginauthenticationFilter.class.getName ()); @Getter @Setter Private String MobileParametername; Public MobileLoginaThenticationFilter (String MobileLoginurl, String MobileParametername, String httpmethod) {super (новый antpathrequestmatcher (mobileloginurl, httpmethod)); this.mobileparametername = mobileparametername; logger.info ("MobileLoginaThenticationFilter Загрузка ..."); } @Override Public Authentication Spearch Outhutentication (запрос httpservletRequest, httpservletresponse response) Throws AuthenticationException, ioException, servletexception {if (postonly &&! Request.getmethod (). request.getMethod ()); } // Получить мобильную строку mobile = eavemobile (request); // Собирать токен MobileLoginauthenticationToken autrequest = new MobileLoginauthenticationToken (Mobile); // разрешить подклассы установить свойство «Подробная информация» SetDetails (запрос, autrequest); вернуть this.getAuthenticationManager (). Authenticate (Authrequest); } / *** Подробная информация для установки аутентификации идентификации* / private void setdetails (httpservletrequest, mobileloginauthenticationtoken authrequest) {authrequest.setdetails (AuthenticationDetailsSource.BuildDetails (запрос)); } / *** Получить номер мобильного телефона* / private String eaveMobile (httpservlectrequest) {return request.getParameter (mobileParametername); } public void setPostonly (boolean postonly) {this.postonly = postonly; }}ПРИМЕЧАНИЕ: Метод попытки authountication ():
2.2.1.1. Поставщик входа в систему аутентификации
/** * Поставщик аутентификации мобильного входа в систему SMS * * @author: catalpaflat */public class mobileloginauthentication provider реализует аутентификацию provider {private static final logger = loggerfactory.getLogger (mobileLoginauthiticationprovider.class.getName ()); @Getter @Setter private userDetailsService CustomUserDetailsService; public mobileLoginaThenticationProvider () {logger.info ("MobileLoginauthenticationProvider загрузка ..."); } /*** Аутентификация* /@Override Public Authentication Authentication (аутентификация аутентификации) THRES AuthenticationException {// Получить информацию токена, инкапсулированную фильткой MobileLoginauthenticationToken AuthenticationToken = (MobileLoginauthenticationToken) аутентификация; // Получение информации пользователя (аутентификация базы данных) userDetails userDetails = CustomUserDetailsService.LoadUserByUsername (((String) AuthenticationToken.getPrincipal ()); // не передается if (userdetails == null) {бросить новый InternalAuthenticationServiceException («Невозможно получить пользовательскую информацию»); } // by MobileLoginauthenticationToken AuthenticationResult = new MobileLoginauthenticationToken (userDetails, userDetails.getAuthorities ()); AuthenticationResult.setDetails (AuthenticationToken.getDetails ()); вернуть аутентификацию } / ** * Согласно типу токена, определите, какой поставщик использовать * / @Override Public Boolean поддержки (класс <?> Аутентификация) {return mobileLoginauthenticationToken.class.isassignablefrom (аутентификация); }}Примечание: метод аутентификации ()
2.2.1.1. Пользовательская конфигурация аутентификации аутентификации аутентификации
Configuration (SpringBeanNameConstant.default_custom_mobile_login_authentication_security_config_bn) открытый класс mobileloginauthenticationsecurityconfig Extends SecurityConfigurerAdapter <DefaulteCurityFilterChain, httpsecurity> {Private Static Logger = Loggerfactory.getLogger (mobileLoginauthenticationsecurityConfig.class.getName ()); @Value ("$ {login.mobile.url}") частная строка defaultmobileLoginurl; @Value ("$ {login.mobile.parameter}") частная строка defaultmobileloginparameter; @Value ("$ {login.mobile.httpmethod}") частная строка defaultmobileLoginhttpmethod; @Autowired private cumpairlconfig CustomyMlConfig; @Autowired private userdetailsservice CustomUserDetailsService; @Autowired Private AuthenticationsUccessHandler CustomAuthenticationsUccessHandler; @Autowired Private AuthenticationFailureHandler CustomAuthenticationFailureHandler; public mobileLoginauthenticationsecurityConfig () {logger.info ("MobileLoginauthenticationsecurityConfig Загрузка ..."); } @Override public void configure (httpsecurity http) выбрасывает исключение {mobilepojo mobile = customymlconfig.getlogins (). Getmobile (); String url = mobile.geturl (); String parameter = mobile.getParameter (). GetMobile (); String httpmethod = mobile.gethttpmethod (); MobileLoginaThenticationFilter mobileLoginauthenticationFilter = new MobileLoginauthenticationFilter (stringUtils.isblank (url)? DefaultMobileLoginurl: url, stringutils.isblank (параметр)? DefaultmobileLoginurl: Parameter, stringUtils.isblank (httpmethod)??)? DefaultMobileLoginHttpMethod: httpmethod); MobileLoginaThenticationFilter.SetAuthenticationManager (http.getsharedObject (AuthenticationManager.class)); MobileLoginaThenticationFilter.SetauthenticationActionCscessHandler (CustomAuthenticationAccessCessHandler); MobileLoginaThenticationFilter.SetAuthenticationFailureHandler (CustomAuthenticationFailureHandler); MobileLoginaThenticationProvider MobileLoginauthenticationProvider = New MobileLoginauthenticationProvider (); MobileLoginaThenticationProvider.SetCustomuserDetailsService (CustomESerDetailsService); http.AuthenticationProvider (MobileLoginaThenticationProvider) .AddFilterAfter (MobileLoginauthenticationFilter, usernamepasswordAuthenticationfilter.class); }}Примечание: метод configure ()
Экземпляр аутентификации и аутентификация
Добавьте аутентификациюфильтер и аутентификацию, проведите, в Spring Security.
2.2.2. Проверьте пользовательский код проверки на основе Redis
2.2.2.1. Пользовательский фильтр кода проверки на основе REDIS
/** * Фильтр кода проверки * * @author: catalpaflat */ @component (springbeannameconstant.default_validate_code_filter_bn) открытый класс validatecodefilter Extends OncePerrequestFilter IminitizingBean {Private Static Final Logger = Loggerfactory.getLogger (validateCodefilter.class.getName ()); @Autowired private cumpairlconfig CustomyMlConfig; @Autowired private redistemplate <Object, Object> Redistemplate; / *** Класс инструментов, который проверяет, соответствует ли запрошенный URL -адрес настроенный URL*/ Private AntPathMatcher Pathmatcher = new AntPathMatcher (); public validateCodefilter () {logger.info ("Загрузка validateCodefilter ..."); } @Override Protected void dofilterinternal (httpservlectrequest -запрос, httpservletresponse ответ, Filterchain filterChain) Throws ServletException, ioException {string url = CustomyMlConfig.getLogins (). GetMobile (). GetUrl (); if (pathmatcher.match (url, request.getRequesturi ())) {string deviceId = request.getheader ("deviceId"); if (stringutils.isblank (deviceId)) {бросить новое customexception (httpstatus.not_acceptable.value (), «не DeviceId в головке запроса»); } String codeParamName = customyMlConfig.getLogins (). GetMobile (). GetParameter (). GetCode (); String Code = request.getParameter (CodeParamName); if (stringUtils.isblank (code)) {бросить новое customexception (httpstatus.not_acceptable.value (), «не код в параметрах запроса»); } String key = systemConstant.default_mobile_key_pix + deviceId; Smscodepo smscodepo = (smscodepo) redistemplate.opforvalue (). Get (key); if (smscodepo.isexpried ()) {бросить новое customexception (httpstatus.bad_request.value (), «код проверки истек»); } String smscode = smscodepo.getCode (); if (stringUtils.isblank (smscode)) {throw new customexception (httpstatus.bad_request.value (), «код проверки не существует»); } if (stringUtils.equals (code, smscode)) {redistemplate.delete (key); // Let It Go FilterChain.dofilter (запрос, ответ); } else {бросить новое customexception (httpstatus.bad_request.value (), "Код проверки неверен"); }} else {// Let It Go FileterChain.dofilter (запрос, ответ); }}}Примечание: dofilterinternal ()
Пользовательская проверка фильтра кода проверки
2.2.2.2. Добавьте пользовательский фильтр кода проверки в цепочку фильтра Spring
http.addfilterbefore (validatecodefilter, AbstractPreauthateCatedProcessingFilter.class)
ПРИМЕЧАНИЕ. Перед добавлением в фильтр предварительной обработки аутентификации
3. Проверьте эффект
Наконец, прилагается адрес исходного кода: https://gitee.com/catalpaflat/springsecurity.git (локальная загрузка)
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.