Spring MVC Java Config (конфигурация с аннотациями) для Spring Security (security-config.xml)
Пример перехода с xml конфигурации Spring Security на Java Config.
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
- Spring MVC 4.2.4.Release
- Spring Security 4.0.4.Release
1. Описание задачи
Преобразовать настройки Spring Security security-config.xml в аналогичный по функционалу Java класс с использованием аннотаций.
2. Структура проекта
Это продолжение первой и второй статей по преобразованию xml конфигурации приложения на Java конфигурацию.
3. security-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <!-- auto-config="true" > Automatically registers a login form, BASIC authentication, logout services. use-expressions Enables EL-expressions in the access attribute --> <http auto-config="true" use-expressions="true" > <!--used to define the set of URL patterns that the application is interested in and to configure how they should be handled. It is used to construct the FilterInvocationSecurityMetadataSource used by the FilterSecurityInterceptor--> <intercept-url pattern="/security/**" access="hasRole('ADMIN')"/> <!--Если попытаться войти без логина на страницу в этом маппинге (например http://localhost:8080/user/), то будет переброшено на страницу, указанную в form-login login-page='pageName.html' --> <intercept-url pattern="/user/**" access="hasRole('USER')"/> <form-login login-page="/login.html" username-parameter="j_username" password-parameter="j_password" login-processing-url="/j_spring_security_check" authentication-failure-url="/login.html?error=true" /> <logout logout-url="/j_spring_security_logout" logout-success-url="/"/> <!--Save logged user in cookie with name key='name' --> <remember-me key="myKey" token-validity-seconds="300"/> <csrf disabled="true"/> </http> <jdbc-user-service id="jdbcUserService" data-source-ref="dataSource" users-by-username-query="SELECT USERNAME, PASSWORD, ENABLED FROM USER WHERE USERNAME=?" authorities-by-username-query="SELECT U.USERNAME, A.AUTHORITY FROM AUTHORITIES A, USER U WHERE U.USERNAME = A.USERNAME AND U.USERNAME = ? "/> <authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="jdbcUserService"/> </authentication-manager> </beans:beans> |
4. SecurityConfig и SpringSecurityInit
Чтобы включить настройку из web.xml — springSecurityFilterChain необходимо создать следующий класс и унаследоваться от AbstractSecurityWebApplicationInitializer. Такая короткая запись сделает полный аналог для фильтра из web.xml. Так же не забывайте о инициализации конфигурации класса SpringConfig в классе WebConfig, описанной в первой части перехода с xml к java config.
1 2 3 4 5 6 7 8 9 10 11 |
package ru.javastudy.mvcHtml5Angular.javaconfig; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; /** * Created for JavaStudy.ru on 30.05.2016. * Automatically register the springSecurityFilterChain Filter for every URL in your application * Add a ContextLoaderListener that loads the SecurityConfig. */ public class SpringSecurityInit extends AbstractSecurityWebApplicationInitializer { } |
Речь идет об этом фильтре:
1 2 3 4 5 6 7 8 |
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Теперь перейдем к самой конфигурации Spring Security в xml.
SecurityConfig:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package ru.javastudy.mvcHtml5Angular.javaconfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import javax.sql.DataSource; /** * Created for JavaStudy.ru on 29.05.2016. * security-config.xml analogue */ @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private DataSource dataSource; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .usersByUsernameQuery("SELECT USERNAME, PASSWORD, ENABLED FROM USER WHERE USERNAME=?") .authoritiesByUsernameQuery("SELECT U.USERNAME, A.AUTHORITY\n" + " \t FROM AUTHORITIES A, USER U WHERE U.USERNAME = A.USERNAME AND U.USERNAME = ?");; } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // .anyRequest().authenticated() //all requests will checked .and() .formLogin().loginPage("/login.html").permitAll().usernameParameter("j_username") .passwordParameter("j_password").loginProcessingUrl("/j_spring_security_check").failureUrl("/login.html?error=true") .and() .httpBasic() .and() .authorizeRequests().antMatchers("/security/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .and() .logout().logoutUrl("/j_spring_security_logout").logoutSuccessUrl("/") .and() .rememberMe().key("myKey").tokenValiditySeconds(300) .and() .csrf().disable(); } } |
Отдельно расписывать каждую строчку не имеет смысла, т.к. они полностью совпадают с аналогичными из security-config.xml.
Описание настроек Spring Security читайте в соответствующей статье из содержания, указанного в начале.
Другие части перехода с xml на Java конфигурацию
Spring MVC Java Config (конфигурация с аннотациями) для web.xml
Spring MVC Java Config (конфигурация с аннотациями) для mvc-config.xml
Spring MVC Java Config (конфигурация с аннотациями) для application-context.xml
Исходный код
23. Annotations config — проект в IDEA
7