Пролетен вход за формуляр за сигурност

1. Въведение

Тази статия ще се фокусира върху Вход с Spring Security . Ще изградим върху простия предишен пример за MVC Spring, тъй като това е необходима част от настройката на уеб приложението заедно с механизма за вход.

2. Зависимостите на Maven

Когато работите с Spring Boot, spring-boot-starter-security starter автоматично ще включва всички зависимости, като например spring-security-core , spring-security-web и spring-security-config, между другото:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

В случай че не използваме Spring Boot, моля, вижте статията Spring Security with Maven, която описва как да добавите всички необходими зависимости. Ще са необходими както стандартните spring-security-web, така и spring-security-config .

3. Spring Security Java Configuration

Нека започнем със създаването на конфигурационен клас Spring Security, който разширява WebSecurityConfigurerAdapter.

Чрез добавяне на @EnableWebSecurity , ние получаваме поддръжка на Spring Security и MVC интеграция:

@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final AuthenticationManagerBuilder auth) throws Exception { // authentication manager (see below) } @Override protected void configure(final HttpSecurity http) throws Exception { // http builder configurations for authorize requests and form login (see below) } }

В този пример използвахме удостоверяване в паметта и дефинирахме 3 потребители.

След това преминаваме през елементите, които сме използвали за създаване на конфигурацията за вход във формуляра.

Нека първо изградим нашия мениджър за удостоверяване.

3.1. Мениджър за удостоверяване

Доставчикът на удостоверяване е подкрепен от проста реализация в паметта - InMemoryUserDetailsManager . Това е полезно за бързо прототипиране, когато все още не е необходим пълен механизъм за постоянство:

protected void configure(final AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") .and() .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); }

Тук конфигурираме трима потребители с твърдо кодирани потребителско име, парола и роля.

Започвайки с Spring 5, ние също трябва да дефинираме енкодер за парола . В нашия пример използвахме BCryptPasswordEncoder:

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

След това нека конфигурираме HttpSecurity.

3.2. Конфигурация за упълномощаване на заявки

Започваме с извършването на необходимите конфигурации за оторизиране на заявки.

Тук разрешаваме анонимен достъп при / вход, за да могат потребителите да се удостоверяват. Ограничаване / админ до ADMIN роли и осигуряване на всичко останало:

@Override protected void configure(final HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() // ... }

Обърнете внимание, че редът на елементите antMatchers () е значителен - по-специфичните правила трябва да са на първо място, последвани от по-общите .

3.3. Конфигурация за влизане във формуляр

След това разширяваме горната конфигурация за влизане и излизане от формуляра:

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) .failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .and() .logout() .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); }
  • loginPage () - потребителската страница за вход
  • loginProcessingUrl () - URL адресът, на който се подават потребителското име и паролата
  • defaultSuccessUrl () - целевата страница след успешно влизане
  • failureUrl () - целевата страница след неуспешно влизане
  • logoutUrl () - персонализираното излизане

4. Добавете Spring Security към уеб приложението

За да използваме дефинираната по-горе конфигурация Spring Security, трябва да я прикачим към уеб приложението.

Ще използваме WebApplicationInitializer , така че не е необходимо да предоставяме web.xml:

public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SecSecurityConfig.class); sc.addListener(new ContextLoaderListener(root)); sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*"); } }

Обърнете внимание, че този инициализатор не е необходим, ако използваме приложение за Spring Boot. Разгледайте нашата статия за автоматичното конфигуриране на защитата Spring Boot за повече подробности за това как се зарежда конфигурацията на защитата в Spring Boot.

5. XML конфигурацията на Spring Security

Нека да разгледаме и съответната XML конфигурация.

Цялостният проект използва Java конфигурация, така че трябва да импортираме XML конфигурационния файл чрез Java @Configuration клас:

@Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig { public SecSecurityConfig() { super(); } }

И XML конфигурацията на Spring Security - webSecurityConfig.xml :

6. Web.xml

Преди въвеждането на Spring 4 , ние използвахме за конфигуриране на Spring Security конфигурацията в web.xml - само допълнителен филтър, добавен към стандартния Spring MVC web.xml :

Spring Secured Application     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /* 

Филтърът - DelegatingFilterProxy - просто делегатите на пролетния управлявана боб - на FilterChainProxy - което от своя страна е в състояние да се възползват от пълния Пролет управление на жизнения цикъл на боб и такива.

7. Формулярът за вход

Страницата с формуляра за вход ще бъде регистрирана в Spring MVC, използвайки директния механизъм за съпоставяне на имената на изгледи с URL адреси, без да е необходим изричен контролер между тях:

registry.addViewController("/login.html");

This, of course, corresponds to the login.jsp:


    
User:
Password:

The Spring Login form has the following relevant artifacts:

  • login – the URL where the form is POSTed to trigger the authentication process
  • username – the username
  • password – the password

8. Further Configuring Spring Login

We briefly discussed a few configurations of the login mechanism when we introduced the Spring Security Configuration above – let's go into some detail now.

One reason to override most of the defaults in Spring Security is to hide the fact that the application is secured with Spring Security and minimize the information a potential attacker knows about the application.

Fully configured, the login element looks like this:

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html",true) .failureUrl("/login.html?error=true") }

Or the corresponding XML configuration:

8.1. The Login Page

Next, let's see how we can configure a custom login page using the loginPage() method:

http.formLogin() .loginPage("/login.html")

Or, via XML configuration:

login-page='/login.html'

If we don't specify this, Spring Security will generate a very basic Login Form at the /login URL.

8.2. The POST URL for Login

The default URL where the Spring Login will POST to trigger the authentication process is /login which used to be /j_spring_security_check before Spring Security 4.

We can use the loginProcessingUrl method to override this URL:

http.formLogin() .loginProcessingUrl("/perform_login")

Or, via XML configuration:

login-processing-url="/perform_login"

A good reason to override this default URL is to hide the fact that the application is actually secured with Spring Security – that information should not be available externally.

8.3. The Landing Page on Success

After a successful login process, the user is redirected to a page – which by default is the root of the web application.

We can override this via the defaultSuccessUrl() method:

http.formLogin() .defaultSuccessUrl("/homepage.html")

Or with XML configuration:

default-target-url="/homepage.html"

In case the always-use-default-target is set to true, then the user is always redirected to this page. If that attribute is set to false, then the user will be redirected to the previous page they wanted to visit before being prompted to authenticate.

8.4. The Landing Page on Failure

Same as with the Login Page, the Login Failure Page is autogenerated by Spring Security at /login?error by default.

To override this, we can use the failureUrl() method:

http.formLogin() .failureUrl("/login.html?error=true")

Or with XML:

authentication-failure-url="/login.html?error=true"

9. Conclusion

В този пример за пролетно влизане конфигурирахме прост процес на удостоверяване - обсъдихме формуляра за влизане в Spring Security, конфигурацията на защитата и някои от по-разширените налични персонализации.

Прилагането на този урок за пролетно влизане може да бъде намерено в проекта GitHub - това е проект, базиран на Eclipse, така че трябва да е лесно да се импортира и да се изпълнява както е.

Когато проектът се изпълнява локално, примерният HTML може да бъде достъпен на:

//localhost:8080/spring-security-mvc-login/login.html