首页 > 代码库 > Spring Security入门(2-2)Spring Security 的运行原理 2

Spring Security入门(2-2)Spring Security 的运行原理 2

Java配置和表单登录

因此使用Java代码配置Spring Security主要是这两个步骤:
1、创建过滤器
2、注册过滤器。

1.创建过滤器
这段配置创建一个Servlet Filter:springSecurityFilterChain,其负责应用中的所有安全,
包括:
保护应用的URLS,
验证提交的username和password,
重定向到登录页面等。

通过以下代码可以看到使用Java配置Spring Security的基础案例:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
}
}

方法名 configureGlobal是无关紧要的,
重要的是在一个添加了 @EnableWebSecurity注解的类里面,注入 AuthenticationManagerBuilder。
这段代码内容很少,但事实上已经做了很多的默认安全验证,包括:
1、访问应用中的每个URL都需要进行验证
2、生成一个登陆表单
3、允许用户使用username和password来登陆
4、允许用户注销
5、CSRF攻击拦截
6、 Session Fixation攻击
7、 安全Header集成

1. 1@EnableWebSecurity
当我们在任意一个类上添加了一个注解@EnableWebSecurity,就可以创建一个名为 springSecurityFilterChain 的Filter。
我们是在一个自定义的SecurityConfig类上加了这个注解。
SecurityConfig类同时也继承了WebSecurityConfigurerAdapter类,
不过需要注意的是,这个过滤器的创建是通过@EnableWebSecurity完成的,与是否继承这个类无关.

实现EnableWebSecurity的源码中加上了@Configuration、@EnableGlobalAuthentication、@Import三个注解,
所以使用@EnableWebSecurity就相当于同时加上了这三个注解。

总结:
@EnableWebSecurity的作用实际上是,创建一个Spring Bean,Bean的类型是Filter,名字为springSecurityFilterChain。
只要我们保证自定义的SecuirtyConfig类,可以被Spring扫描到,就可以帮助我们创建这个Filter了。

1.2 springSecurityFilterChain 过滤器的类型是什么
Filter的创建是通过WebSecurity对象的build方法完成的,
WebSecurity由WebSecurityConfiguration创建,
而WebSecurity的作用是用于创建一个类型为FilterChainProxy的过滤器,
FilterChainProxy是Filter的子类,
我们所说的创建一个名字为springSecurityFilterChain的过滤器,
实际上过滤器的具体类型就是FilterChainProxy

2.注册过滤器
下一步是注册springSecurityFilterChain。这个可以借助Spring3.1引入的WebApplicationInitializer完成。
SpringSecurity提供了一个基类 AbstractSecurityWebApplicationInitializer来确保 springSecurityFilterChain被注册。

项目中已经使用了SpringMvc
如果在我们的应用程序中已经使用了Spring,那么在我们的应用中可能已经有了一个 WebApplicationInitializer来加载我们的配置,
如果我们还使用之前的代码,将会出现一个错误。
此时我们应该在已经存在的ApplicationContext中注册Spring Security。
例如,如果我们已经使用SpringMvc,那么我们的代码应该是如下所示:

import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}

Spring Security入门(2-2)Spring Security 的运行原理 2