Spring Security - это большой модуль, и эта статья включает только аутентификацию пользовательских параметров. Параметры проверки по умолчанию Spring Security - это только имя пользователя и пароль, которых, как правило, недостаточно. Поскольку время прошло слишком долго, некоторые забыли, а некоторые из них могут отсутствовать. ОК, без чушь.
Конфигурации безопасности пружины и пружины используют Javaconfig, а версии - 4.2.5 и 4.0.4 по очереди.
Общая идея: настраивайте входную точку, добавьте пользовательские параметры для расширения аутентификации и аутентификации для проверки.
Сначала определите входную точку:
Импорт org.springframework.security.core.authenticationException; импорт org.springframework.security.web.authentication.loginurlauthenticationEntrypoint; импорт javax.servlet.servletexception; import javax.servlet.http.httpservlectrequest; javax.servlet.http.httpservletresponse; import java.io.ioexception; public class myauthenticationEntrypoint Extends LoginUrlauthenticationEntryPoint {public myAuthenticationEntryPoint (String LoginFormurl) {super (LogInFormUrl); } @Override public void начинается (httpservlectrequest, httpservletresponse response, AuthenticationExexception autexception) бросает ioException, servletexception {super.commence (запрос, ответ, autexception); }}Следующим является токен, ValidCode является параметром кода проверки:
Import org.springframework.security.authentication.usernamepasswordAuthenticationtoken; открытый класс myusernamepasswordAuthentication extends usernamepassWordAuthenticationToken {Private String ValidCode; public myusernamepasswordAuthenticationToken (String Principal, String retreations, String videyCode) {Super (Principal, учетные данные); this.validcode = valdcode; } public String getValidCode () {return ValdCode; } public void setValidCode (string valiveCode) {this.validCode = valdCode; }}Продолжить обработкуфильтера,
Import com.core.shared.validatecodehandle; import org.springframework.security.core.authentication; import org.springframework.security.core.authenticationException; импорт org.springframework.security.web.authentication.abstractenthauthytenctionProcessingFilter.security.Web.Authentication.AbStractAuthoutenticationProcessingFilter.security.Web.Authentication.abstractAuthenticationProcessingFilter. org.springframework.security.web.util.matcher.antpathrequestmatcher; import javax.servlet.servletexception; import javax.servlet.http.httpservlectrequest; impormancev.Servlet.http.httpservessevonse. java.io.ioexception; открытый класс myvalidcodeprocessingfilter extrable AbstractAuthenticationProcessingFilter {Private String userNameParam = "userName"; Private String passwordParam = "пароль"; Private String videoCodeparam = "validateCode"; public myvalidcodeprocessingfilter () {super (новый antpathrequestmatcher ("/user/login", "post")); } @Override Public Authentication попытка оборудования (запрос httpservletrequest, httpservletresponse response) Throws AuthenticationException, ioException, Servletexception {String username = request.getParameter (usernameparam); String password = request.getParameter (passwordParam); String valiveCode = request.getParameter (validCodeparam); Valid (ValidCode, request.getSession ()); MyusernamepasswordAuthenticationtoken token = new myusernamepasswordAuthenticationToken (имя пользователя, пароль, ValidCode); вернуть это. GetAuthenticationManager (). Authenticate (Token); } public void Valid (String ValidCode, httpsession Session) {if (validcode == null) {throw new ValdCodeerRorexception ("validAteCode пуст!"); } if (! validatecodehandle.matchcode (session.getId (), validCode)) {бросить новый ValidCodeerRorexception ("validcodeerror!"); }}} Определите три параметра отдельно, которые используются для получения параметров из формы входа в систему. Метод строительства дает URL -адрес входа и требуемый метод POST
Следующим является аутентификация. До появления имени пользователя и пароля аутентификации я просто аутентифицировал код проверки.
Вот класс инструментов validatecodehandle и validcodeerrorexception:
import java.util.concurrent.concurrenthashmap; открытый класс validatecodehandle {private static comurrenthashmap validatecode = new concurrenthashmap <> (); public static concurrenthashmap getCode () {return validateCode; } public static void save (строка sessionId, string code) {validatecode.put (sessionId, code); } public Static String getValidateCode (String sessionId) {Object obj = validAteCode.get (sessionId); if (obj! = null) {return string.valueof (obj); } return null; } public Static Boolean MatchCode (String SessionId, String InputCode) {String SaveCode = getValidateCode (sessionId); if (savecode.equals (inputcode)) {return true; } вернуть false; }}Здесь вам необходимо унаследовать AuthenticationException, чтобы указать, что это сбой аутентификации безопасности, так что будет соблюдаться последующий процесс отказа.
Import org.springframework.security.core.authenticationException; открытый класс validcodeerrorexception extends authenticationException {public advallCodeerRorexception (String msg) {super (msg); } public ValidCodeErrorexception (String msg, throwable t) {super (msg, t); }}Далее провайдер:
Импорт org.springframework.security.authentication.badcredentialSexception; импорт org.springframework.security.authentication.usernamepasswordAuthenticationToken org.springframework.security.core.authenticationException; import org.springframework.security.core.userdetails.userdetails; открытый класс MyAuthenticationProvider Extends DaoauthenticationProvider {@Override Public Boolean MyusernamepasswordAuthenticationtoken.class.isassignablefrom (аутентификация); } @Override Protected void emplyAuthenticationChecks (userDetails userDetails, userNamePassWordAuthenticationtoken Authentication) Throws AuthenticationException {Object Salt = null; if (getAltSource ()! = null) {salt = getAltSource (). getAlt (userDetails); } if (Authentication.getCredentials () == null) {logger.debug ("Аутентификация не удалась: не предоставлены учетные данные"); Бросьте New BadcredentialSexception («Имя пользователя или ошибка пароля!»); } String presentedPassword = authentication.getCredentials (). ToString (); if (! this.getPasswordEncoder (). ISpassWordValid (userDetails.getPassword (), PresentedPassword, Salt)) {logger.debug ("Ошибка аутентификации: пароль не соответствует хранительному значению"); Бросьте новое BadcredentialSexception («под именем пользователя или паролем!»); }}} Метод поддержки определяет использование пользовательского токена, а метод дополнительной проверки.
Далее находится обработчик, который обрабатывает успешную аутентификацию и неудачную аутентификацию
Импорт org.springframework.security.core.authentication; import org.springframework.security.web.authentication.simpleurlauthenticationsuccesshandler; импорт javax.servlet.servletexception; import javax.servlet.http.httpservlectrequest; javax.servlet.http.httpservletresponse; import java.io.ioexception; открытый класс FrontauthenticationsUccessHandler расширяет SimpleUrlauthenticationAccessHandler {public FrontAuthenticationAccessHandler (String DefaultArgetUrl) {Super (DefaultTargetUrgeturl); } @Override public void onAuthenticationActionCscess (httpservlectrequest, httpservletresponse response, аутентификация аутентификации), выбрасывает ioexception, Servletexception {super.onauthenticationsuccess (запрос, ответ, аутентификация); }} Импорт org.springframework.security.core.authenticationException; Import org.springframework.security.web.authentication.simpleurlauthenticationFailureHandler; импорт javax.servlet.servletexception; import javax.servlet.http.httpservlectrequest; javax.servlet.http.httpservletresponse; import java.io.ioexception; открытый класс FrontauthenticationFailureHandler Extens SimpleUrlauthenticationFailureHandler {public frontauthenticationFailureHandler (строка defaultfailureUrl) {super (DefaultFailureUrl); } @Override public void onauthenticationFailure (httpservlectrequest, httpservletresponse response, исключение AuthenticationException). Выбросы IOException, ServletException {super.OnauthenticationFailure (запрос, ответ, исключение); }}Наконец, самая важная конфигурация безопасности:
Импорт com.service.user.customerservice; import com.web.filter.sitemeshfilter; import com.web.mysecurity.*; import org.springframework.beans.factory.antoration.autowired; импорт org.springframework.context.antoration.bean. org.springframework.context.annotation.configuration; импорт org.springframework.core.annotation.order; import org.springframework.security.authentication.AuthenticationManager; импорт org.springframework.security.authentication.AuthenticationProvider; org.springframework.security.authentication.providermanager; import org.springframework.security.config.annotation.web.builders.httpsecurity; import org.springframework.security.config.annotation.web.configuration.enablewebsecurity; org.springframework.security.config.annotation.web.configuration.websecurityConfigurerAdapter; import org.springframework.security.crypto.password.passwordencoder; import.springframework.security.crypto.passwordswresswresswradencoder; org.springframework.security.web.access.exceptionTranslationFilter; импорт org.springframework.security.web.authentication.usernamepasswordAuthenticationFilter; импорт org.sprimework.security.web.context.abstractsecuritywebapprication org.springframework.web.filter.characterencodingfilter; import javax.servlet.dispatchertype; import javax.servlet.filterRegistration; импорт javax.servlet.servletcontext; import java.util.arraylist; import java.Uut.enumset; java.util.list. } @Autowired Private Customers Customerservice; @Configuration @Order (1) Public Static Class FrontendWebsecurityConfigureAdapter Extends WebseCurityConfigurerAdapter {@Autowired Private MyValidCodeProcessingFilter myValidCodeProcessingFilter; @Override Protected void configure (httpsecurity http) бросает исключение {http.csrf (). Disable () .authorizerequests () .antmatchers («/user/login», «/user/logout»). .AddFilterBefore (myValidCodeProcessingFilter, userNamePassWordAuthenticationFilter.class) .formLogin () .loginPage ("/user/login"). и () .logout () .logouturl ("/user/logout") .logoutsuccurl ("/user/login"); }} @Bean (name = "frontauthenticationprovider") public myauthentication provider frontauthenticationprovider () {myauthenticationprovider myauthentication provider = new myauthentication provider (); MyAuthenticationProvider.SetUserDetailsService (Customerervice); myauthentication provider.setpasswordencoder (passwordEncoder ()); вернуть myauthentication -provider; } @Bean public authentication manage outenticationmanager () {list <witencationprovider> list = new ArrayList <> (); list.add (Frontauthenticationprovider ()); AuthenticationManager AuthenticationManager = New ProviderManager (список); вернуть аутентификацию Manager; } @Bean public myvalidcodeprocessingfilter myvalidcodeprocessingfilter (аутентификация Manager AuthenticationManager) {myValidCodeprocessingFilter filter = new MyValidCodepRocessingFilter (); Filter.setAuthenticationManager (AuthenticationManager); Filter.SetAuthenticationSuccessHandler (FrontauthenticationsUccessHandler ()); Filter.SetAuthenticationFailureHandler (FrontauthenticationFailureHandler ()); вернуть фильтр; } @Bean public frontauthenticationfailurehandler frontauthenticationfailurehandler () {return new FrontauthenticationfailureHandler ("/user/login"); } @Bean public frontauthenticationsuccesshandler frontauthenticationsuccesshandler () {return newauthounticationsUccessHandler ("/front/test"); } @Bean public myauthenticationEntrypoint myAuthenticationEntryPoint () {return new MyAuthenticationEntryPoint ("/user/login"); }}Прежде всего, это фасоль класса шифрования, а Customerervice - это простой пользователь запроса
@Service ("Customerers") Общедоступный класс CustomersImpl реализует customerservice {@autowired private userdao userdao; @Override public userDetails lokuserByUsername (String UserName) выбрасывает usernameNotFoundException {return userDao.findcustomerbyusername (username); }} Следующим является FrontEndWebsecurityConfigureAdapter. Я переписал метод настройки, сначала отключил CSRF, включил AuthorizERequests (), где «/пользователь/логин» и «/пользователь/вход» «Пусть проверка разрешения» и другие запросы требуют аутентификации входа в систему, а затем AddFilterBefore (). Прежде чем добавить мой пользовательский myvalidcodeprocessingfilter в UsernamepassWordAuthenticationFilter в безопасности, я сначала выполняю свою пользовательскую аутентификацию параметров, а затем FormLogin (), настроить URL и URL входа в систему, а также вход в систему, URL, вход в систему, URL -логин и вход в систему, чтобы выпустить URL.
Далее следует объявление дисплея бобов, Authentication Provider, Authentication Manager, ProcessingFilter, AuthenticationFailureHandler, AuthenticationCescessHandler и IntryPoint.
Ниже login.jsp
<body> <div> <form: form autocomplete = "false" commandMAme = "userDto" method = "post"> <div> <pan> <b> $ {spring_security_last_exception.message} </b> </span> </div> имени пользователя: <form: ports = "cssclass =" path="password" cssClass="form-control"/><br/> validateCode:<form:input path="validateCode" cssClass="form-control"/> <label>${validate_code}</label> <div> <label> <input type="checkbox" name="remember-me"/> Remember me</label> </div> <input type="submit" value = "Opper"/> </form: form> </div> </body>Когда код проверки не удается, ValidCodeErrorexception выбрасывается. Поскольку он унаследовал Euthentication Exception, когда безопасность встречает Authentication Exception, AuthenticationFailureHandler будет запускаться. Вышеупомянутый фасоль заявляет, что аутентификация не удалась и переходит к URL входа в систему, поэтому есть $ {Spring_security_last_exception.message} в login.jsp. Информация об исключении брошена при аутентификации, что может вызвать удобное для пользователя.
Весь пользовательский процесс проверки безопасности завершен
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.