Java配置使用and()方法相当于XML标签的关闭,这样允许我们继续配置父类节点。如果你阅读代码他很合理,我想配置请求验证,并使用表单和HTTP基本身份验证进行登录。
因此使用Java代码配置Spring Security主要是这两个步骤:
1、创建过滤器
2、注册过滤器。
这段配置创建一个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"); } } 12345678910111213141516171819方法名 configureGlobal是无关紧要的,重要的是在一个添加了 @EnableWebSecurity注解的类里面,注入 AuthenticationManagerBuilder。这段代码内容很少,但事实上已经做了很多的默认安全验证,包括:
1、访问应用中的每个URL都需要进行验证
2、生成一个登陆表单
3、允许用户使用username和password来登陆
4、允许用户注销
5、CSRF攻击拦截
6、 Session Fixation攻击
7、 安全Header集成
当我们在任意一个类上添加了一个注解@EnableWebSecurity,就可以创建一个名为 springSecurityFilterChain 的Filter。我们是在一个自定义的SecurityConfig类上加了这个注解。SecurityConfig类同时也继承了WebSecurityConfigurerAdapter类,不过需要注意的是,这个过滤器的创建是通过@EnableWebSecurity完成的,与是否继承这个类无关.
实现EnableWebSecurity的源码中加上了@Configuration、@EnableGlobalAuthentication、@Import三个注解,所以使用@EnableWebSecurity就相当于同时加上了这三个注解。
总结: @EnableWebSecurity的作用实际上是,创建一个Spring Bean,Bean的类型是Filter,名字为springSecurityFilterChain。只要我们保证自定义的SecuirtyConfig类,可以被Spring扫描到,就可以帮助我们创建这个Filter了。
Filter的创建时通过WebSecurity对象的build方法完成的,WebSecurity由WebSecurityConfiguration创建,而WebSecurity的作用是用于创建一个类型为FilterChainProxy的过滤器,FilterChainProxy是Filter的子类,我们所说的创建一个名字为springSecurityFilterChain的过滤器,实际上过滤器的具体类型就是FilterChainProxy
下一步是注册springSecurityFilterChain。这个可以借助Spring3.1引入的WebApplicationInitializer完成。SpringSecurity提供了一个基类 AbstractSecurityWebApplicationInitializer来确保 springSecurityFilterChain被注册。
如果在我们的应用程序中已经使用了Spring,那么在我们的应用中可能已经有了一个 WebApplicationInitializer来加载我们的配置,如果我们还使用之前的代码,将会出现一个错误。此时我们应该在已经存在的ApplicationContext中注册Spring Security。例如,如果我们已经使用SpringMvc,那么我们的代码应该是如下所示:
import org.springframework.security.web.context.*; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }