Bession Security Basic введение
Я не дам слишком много знакомства с весенней безопасностью здесь. Для получения подробной информации, пожалуйста, обратитесь к официальной документации.
Я буду говорить только о основных функциях Springsecurity:
Основная конструкция среды
Здесь мы используем Springboot в качестве основной основы проекта. Я использую метод Maven для управления пакетами, поэтому мы сначала даем метод интеграции безопасности Spring.
<deperiandencies> ... <зависимость> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-security </artifactid> </dependency> ... </depertive>
Затем установите интерфейс запроса веб -слоя
@Restcontroller @requestmapping ("/user") открытый класс usercontroller {@getmapping public String getUsers () {return "Hello Spring Security"; }}Затем вы можете запустить проект напрямую и вызвать интерфейс, чтобы увидеть эффект.
Вызов через веб -страницу
Сначала мы проводим интерфейсный вызов через браузер и напрямую доступ к http: // localhost: 8080/user. Если интерфейс можно получить нормально, то следует отобразить «Hello Spring Security».
Но мы не можем получить к нему доступны обычно, и появляется поле ввода аутентификации на рисунке ниже
Это потому, что в Springboot безопасность пружины по умолчанию эффективна. В настоящее время интерфейсы защищены, и нам нужно пройти проверку, чтобы получить доступ к ним нормально. Spring Security предоставляет пользователя по умолчанию, имя пользователя является пользователем, а пароль автоматически генерируется при запуске проекта.
Когда мы проверим журнал запуска проекта, мы найдем следующий журнал
Использование пароля безопасности по умолчанию: 62CCF9CA-9FBE-4993-8566-8468CC33C28C
Конечно, пароль, который вы видите, должен отличаться от моего. Мы вхожу в систему с пользователем и паролем в журнале запуска.
После успешного входа в систему вы прыгаете на страницу, где интерфейс называется нормально.
Если вы не хотите включать Spring Security с самого начала, вы можете настроить следующее в файле конфигурации:
# Security включает безопасность.basic.enabled = false
Коробка для входа в систему, которую я только что увидел, была предоставлена Springsecurity, которая называется httpbasiclogin. Это не то, что мы хотим от нашего продукта. Наш фронт-END, как правило, выполняет проверку входа в систему пользователя через подачу формы, поэтому нам необходимо настроить нашу собственную логику аутентификации.
Настроить логику аутентификации пользователей
Каждая система должна иметь свой собственный набор пользовательских систем, поэтому нам нужно настроить нашу собственную логику аутентификации и интерфейс входа в систему.
Здесь нам нужно соответствующим образом настроить Springsecurity
@ConfigurationPublic Class BrowerSecurityConfig Extends WebseCurityConfigurerAdapter {@Override Protected void configure (httpsecurity http) Обращает исключение {http.formlogin () // Определить страницу логина, чтобы быть перенесенным, когда пользователь должен быть введен в систему. И. и которые не должны быть защищены. AnyRequest () // Для любого запроса вы можете получить доступ }}Затем настройте логику аутентификации пользователя, потому что у нас есть собственная пользовательская система.
@Componentpublic class myuserdetailsservice реализует userdetailsservice {private logger = loggerfactory.getlogger (getClass ()); @Override public userDetails lokuserByUsername (String UserName) выбрасывает usernameNotFoundException {logger.info ("Имя пользователя пользователя: {}", username); // TODO в соответствии с именем пользователя, найдите соответствующий пароль и инкапсулируйте информацию пользователя и возвращайте. Параметры: Имя пользователя, пароль, разрешение пользователя Пользователь пользователя = новый пользователь (пользователь, "123456", AuthorityUtils.commaseparatedStringtoAuthorityList ("admin")); вернуть пользователь; }} Мы не выполняли слишком много проверки здесь. Имя пользователя может быть заполнено по желанию, но пароль должен быть «123456», чтобы мы могли успешно войти в систему.
В то же время мы видим, что третий параметр объекта пользователя здесь представляет разрешения текущего пользователя, и мы устанавливаем его на «администратор».
Запустите программу, чтобы проверить ее, и вы обнаружите, что интерфейс входа в систему изменился.
Это потому, что мы настроили http.formLogin() в файле конфигурации
Давайте просто заполним пользователя здесь, а затем заполним неправильную версию (не-123456). Это приведет к ошибке проверки:
В то же время, на консоли, пользователь, которого вы только что заполнили, когда входите в систему, также будет распечатан.
Теперь давайте попробуем войти в систему с правильным паролем. Вы можете обнаружить, что он пройдет проверку и перейдет на правильную страницу интерфейса.
Userdetails
Только сейчас, когда мы писали MyUserDetailsService , мы реализовали метод и вернули UserDetails . Этот пользовательский институт является объектом, который инкапсулирует пользовательскую информацию, которая содержит семь методов
Public Interface userDetails Extends Serializable {// Инкапсулированный сбор информации о разрешении <? расширяет wreatedAuthority> getAuthorities (); // Информация о пароле string getPassword (); // rouge username string getUsername (); // Срок действия учетной записи истекает логический isaccountnonexpired (); // является ли аккаунт замороженный логический Isaccountnonlocked (); // Срок действия пароля учетной записи истекает, как правило, некоторые системы с высокими требованиями пароля будут использовать его. По сравнению с пользователем необходимо сбросить пароль время от времени. // Доступна ли учетная запись? Boolean Isenabled ();}Когда мы возвращаем пользователь класса реализации userDetails, мы можем установить соответствующие параметры с помощью метода пользователя конструктора
Шифрование пароля и дешифрование
В Springsecurity есть интерфейс PasswordEncoder
public interface passwordEncoder {// incrypt строка пароля (char -secureceence var1); // Определите пароль для совпадения логических совпадений (ChareSequence var1, String var2);} Нам просто нужно самостоятельно реализовать этот интерфейс и настроить его в файле конфигурации.
Здесь я временно проверю его с помощью класса реализации, предоставленного по умолчанию
// browersecurityconfig @beanpublic passwordEncoder passwordEncoder () {return new bcryptpasswordencoder (); }Использование шифрования:
@Componentpublic class myuserdetailsservice реализует userdetailsservice {private logger = loggerfactory.getlogger (getClass ()); @Autowired private passwordEncoder passwordEncoder; @Override public userDetails lokuserByUsername (String UserName) выбрасывает usernameNotFoundException {logger.info ("Имя пользователя пользователя: {}", username); String password = passwordEncoder.encode ("123456"); logger.info ("пароль: {}", пароль); // Параметры: Имя пользователя, пароль, разрешения пользователя пользователь пользователь = новый пользователь (имя пользователя, пароль, AuthorityUtils. вернуть пользователь; }}Здесь мы просто шифруем 123456. Мы можем провести тесты и обнаружить, что пароль, напечатанный каждый раз, отличается. Это роль настроенного BcryptPasswordEncoder.
Персонализированная логика аутентификации пользователей
Пользовательская страница входа в систему
В предыдущих тестах всегда использовался интерфейс входа в систему по умолчанию. Я считаю, что у каждого продукта есть свой собственный дизайн интерфейса входа в систему, поэтому мы узнаем о том, как настроить страницу входа в систему в этом разделе.
Давайте сначала напишем простую страницу входа в систему
<! Doctype html> <html lang = "en"> <head> <meta charset = "UTF-8"> <Title> страница входа </title> </head> <body> <h2> страница входа в систему </h2> <form action = "/user/login" method = "post"> <ttle> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> usernam type = "text" name = "username"> </td> </tr> <tr> <td> пароль: </td> <td> <input type = "password" name = "password"> </td> </tr> <tr> <td colspan = "2"> <button = "force> </td> </td> </trt> </tr. </trt> </tr> </tr> </trt> </td> </tr> </trt> </td> </td> </td> </td> </td> </td> </td> </td> </t.
После завершения страницы входа вам необходимо настроить ее для Springsecurity
// browersecurityconfig.java@overrideprotected void configure (httpsecurity http) throws exection {http.formlogin () // Определить страницу входа в систему, чтобы быть передаваемым, когда пользователь должен войти в систему. // пользовательский интерфейс входа в систему. И () .AuthorizeRequests () // Определите, какие URL должны быть защищены, а какие не нужно защищать. // выключить защиту CSRF}Таким образом, всякий раз, когда мы получаем доступ к защищенному интерфейсу, мы будем перенесены на страницу login.html
Обрабатывать различные типы запросов
Поскольку теперь передние и задние концы, как правило, разделены, задний конец обеспечивает интерфейсы для передней части для вызова и возвращает данные формата JSON на переднюю часть. Как и прежде, защищенный интерфейс был вызван, и прыжок страницы был непосредственно перенаправлен. Это приемлемо на веб -стороне, но на стороне приложения это невозможно, поэтому нам нужно сделать дальнейшую обработку.
Вот простая идея разобраться
Во -первых, напишите пользовательский контроллер и перейдите к нему, когда требуется аутентификация идентификации.
@RestControllerPublic Class BrowserSecurityController {private logger logger = loggerFactory.getLogger (getClass ()); // Кэширование и восстановление исходной информации о запросе private requestCache requestCache = new httpsessionRequestcache (); // используется для перенаправления частной redirectStrategy redirectStrategy = new DefaultRedirectStrategy (); /** * Когда требуется аутентификация идентификации, перепрыгивайте через * @param requer * @param response * @return */@requestmapping ("/outentication/require") @ResponsEStatus (code = httpStatus.Unauthorized) public baseresponse tressAuthenco savedRequest = requestCache.getRequest (запрос, ответ); if (savedRequest! = null) {string targetUrl = savedRequest.getredirecturl (); logger.info («запрос на запуск прыжка:» + targetUrl); if (stringutils.endswithIgnorecase (targetUrl, ".html")) {redirectStrategy.sendredirect (запрос, ответ "/login.html"); }} вернуть новый baseresponse («Доступная служба требует аутентификации идентификации, пожалуйста, направьте пользователя на страницу входа в систему»); }}Конечно, файл конфигурации должен быть изменен соответствующим образом, поэтому я не буду размещать код здесь. Это открыть интерфейс.
Расширения:
Здесь мы пишем интерфейс, к которому обращается с веб -страницы, затем переходим на страницу «/login.html». Фактически, мы можем расширить его и настроить адрес прыжка в файл конфигурации, который будет более удобным.
Пользовательская обработка входа в систему успешно/неудач
В предыдущих тестах перенаправление страницы проводилось после успешного входа.
В случае разделения передних и задних концов, если мы успешно войдут в систему, нам может потребоваться вернуть личную информацию пользователя на переднюю часть, а не прыгать напрямую. То же самое верно для неудачного входа.
Это включает в себя два интерфейса в Spring Security AuthenticationSuccessHandler и AuthenticationFailureHandler . Мы можем реализовать этот интерфейс и соответствующим образом настроить его. Конечно, в рамках есть класс реализации по умолчанию. Мы можем унаследовать этот класс внедрения и настроить наш бизнес
@Component ("MyAuthenctiationSuccessHandler") открытый класс myAuthenctiationsuccessHandler расширяет простой experlauthenticationsUccessHandler {private logger = loggerFactory.getLogger (getClass ()); @Autowired Private ObjectMapper ObjectMapper; @Override public void onAuthenticationActionUccess (httpservlectrequest, httpservletresponse, ответ аутентификации), выбрасывает ioexception, servletexception {logger.info («Вход в систему успешно»); response.setContentType ("Application/json; charset = utf-8"); response.getWriter (). write (objectmapper.writevalueasString (аутентификация)); }} Здесь мы возвращаем строку JSON через ответ.
Третий параметр в этом методе, Authentication , содержит информацию пользователя входа в систему (userdetails), информацию сеанса, информация для входа в систему и т. Д.
@Component ("MyAuthenctiationFailureHandler") открытый класс myAuthenctiationFailureHandler Extends SimpleUrlauthenticationFailureHandler {private logger = loggerFactory.getLogger (getClass ()); @Autowired Private ObjectMapper ObjectMapper; @Override public void onauthenticationFailure (httpservletRequest, httpservletresponse, ответ AuthenticationException), бросает ioException, servletexception {logger.info ("login fail"); response.setStatus (httpstatus.internal_server_error.value ()); response.setContentType ("Application/json; charset = utf-8"); response.getWriter (). write (objectmapper.writevalueasstring (new baseresponse (exception.getmessage ()))); }} Третий параметр в этом методе AuthenticationException , включает в себя информацию об сбое входа в систему.
Аналогичным образом, все еще необходимо настроить его в файле конфигурации. Я не буду публиковать весь код здесь, опубликованы только соответствующие заявления.
.successhandler (myauthenticationsuccessHandler) // Custom Login успешно обрабатывает.
Код
Вы можете нажать мне, чтобы просмотреть полный код
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.