1. Обзор
Эта статья является введение в конфигурацию Java для системы весенней что позволяет пользователям легко настроить Spring Security без использования XML- .
Конфигурация Java была добавлена в структуру Spring в Весна 3.1 и распространяется на весеннюю безопасность в Весна 3,2 и определяется в классе, аннотированном @Configuration .
2. Мавен Настройка
Чтобы использовать Spring Security в проектах Maven, мы сначала должны иметь весна-безопасность основных зависимость в проекте пом.xml :
org.springframework.security spring-security-core 5.3.3.RELEASE
Последнюю версию всегда можно найти здесь .
3. Веб-безопасность с конфигурацией Java
Начнем с основного примера конфигурации Spring Security Java:
@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }
Как вы могли заметить, конфигурация настраивает основную конфигурацию подлинности памяти. Кроме того, начиная с весны 5, нам нужен фасоль PasswordEncoder:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
4. HTTP безопасности
Для обеспечения безопасности HTTP весной нам необходимо расширить WebSecurityКонфигурерАдаптер для обеспечения конфигурации по умолчанию в настроить (HttpSecurity http) метод:
protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); }
Вышеупомяшная конфигурация по умолчанию гарантирует, что любой запрос в приложение проверен с помощью входа на основе формы или базовой аутентификации HTTP.
Кроме того, он точно похож на следующую конфигурацию XML:
5. Форма входа
Интересно, что Spring Security автоматически генерирует страницу входа, основываясь на функциях, которые включены, и используя стандартные значения для URL-адреса, который обрабатывает представленный логин:
protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }
Здесь автоматически генерируемая страница входа удобна для быстрого запуска.
6. Авторизация с ролями
Теперь настройте несколько простых авторизаций на каждом URL с использованием ролей:
protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }
Обратите внимание, как мы используем как тип-безопасный API – имеетРоле – но и API на основе выражения, через доступ.
7. Логут
Как и многие другие аспекты Весенней безопасности, logout имеет некоторые большие по умолчанию, предоставляемые структурой.
По умолчанию запрос logout аннулирует сеанс, очищает любые кэши аутентификации, очищает SecurityContextHolder и перенаправляет на страницу входа.
Вот простой logout config:
protected void configure(HttpSecurity http) throws Exception { http.logout(); }
Однако, если вы хотите получить больше контроля над доступными обработчиками, вот как будет выглядеть более полная реализация:
protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }
8. Аутентификация
Давайте посмотрим на другой способ обеспечения аутентификации с Spring Security.
8.1. Проверка подлинности памяти
Начнем с простой конфигурации в памяти:
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); }
8.2. Проверка подлинности JDBC
Чтобы переместить это в JDBC, все, что вам нужно сделать, это определить источник данных в приложении – и использовать это непосредственно:
@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); }
Конечно, с обоими вышеуказанными примерами, мы также должны определить ПарольЭнкодер фасоли, как указано в разделе 3.
9. Заключение
В этом быстром учебнике мы перешел к основам конфигурации Java для весенней безопасности и сосредоточился на образцах кода, которые иллюстрируют простейшие сценарии конфигурации.