原理
当一个请求进来时,先经过各种过滤器(通过代码配置生效),比如UserName Password AuthenticationFilter(表单登录)、BasicAuthenticationFilter(Basic登录)等
最后经过FilterSecurityInterceptor,这是Spring Security验证的最后一步,如果验证通过则正常访问服务,如果验证不通过则会抛出异常
异常由ExceptionTranslationFilter捕获,根据异常来做不同处理,比如未登录,则跳转登录页面
使用Maven
因项目spring版本为4.X,所以选择的是4.2.3.RELEASE版本
<!--核心-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!--配置-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
配置类Security
创建WebSecurityConfig
@Configuration
// 使用Security
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().and().authorizeRequests().anyRequest().authenticated();
}
}
上段代码说明访问的请求基于表单验证,并且所有请求都需要用户被认证
如果我们在应用程序的其他地方已经使用了Spring,那么我们已经有了一个 WebApplicationInitializer用来载入Spring的配置。所以我们应该使用已经存在的 ApplicationContext 注册Spring Security。
创建SecurityWebApplicationInitializer
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}
创建一个扩展 AbstractSecurityWebApplicationInitializer 的一个类, 它将会自动地加载 springSecurityFilterChain,相当于配置web.xml
public class WebAppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { WebSecurityConfig.class };
}
// ... other overrides ...
}
现在访问网站任意地址都会提示到跳转登录了