<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </dependency>
AbstractSecurityWebApplicationInitializer
的類。這個操做會致使一個名爲DelegatingFilterProxy
的Filter
被註冊,它會攔截髮往應用中的請求,並將請求委託給ID爲SpringSecurityFilterChain
的beanpublic class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer { }
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { }
至此Spring Security就被啓用了,目前全部的請求都會被攔截。web
WebSecurityConfigurerAdapter
中有三個名爲configure
的方法提供重載,三個方法的描述以下:spring
方法 | 描述 |
---|---|
configure(HttpSecurity) | 配置攔截模式 |
configure(AuthenticationManagerBuilder) | 配置用戶信息 |
configure(WebSecurity) | 配置Spring Security的Filter鏈 |
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() // 基於內存的用戶存儲 .withUser("admin") .password("password") .roles("USER", "ADMIN"); }
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/info").authenticated() .antMatchers(HttpMethod.GET, "/health").hasAnyAuthority("ADMIN") .anyRequest().permitAll(); } }
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().permitAll() .and() .requiresChannel() .antMatchers("/bankInfo").requiresSecure() // enable HTTPS .antMatchers("/").requiresInsecure(); // disable HTTPS } }
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().permitAll() .and() .csrf().disable(); } }
configure(HttpSecurity)
以前會有一個默認的登陸頁面,須要登陸時會自動跳轉到這個位於/login
下的頁面,但一旦重寫此方法後就會失去這個簡單的登陸頁面。@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().permitAll() .and() .formLogin(); } }
若是不想作多餘的配置,那麼自定義的頁面裏:ide
form
的action
應該提交到/login
username
的輸入域且name
屬性爲username
password
的輸入域且name
屬性爲password
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().permitAll() .and() .formLogin().loginPage("/login"); } }
@Configuration @EnableWebMvc @ComponentScan public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/login").setViewName("login"); } }
ViewControllerRegistry
能夠用來直接轉發請求到一個視圖而無需編寫控制器類。ui
CSRF
,直接訪問\logout
就可實現登出CSRF
,用POST
方法訪問\logout
並帶上CSRF Token