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

Posted 非淡泊无以明志,非宁静无以致远 - 长安快马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. [email protected]
当我们在任意一个类上添加了一个注解@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的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot集成Spring Security——自动登录

Spring Security 动态url权限控制

002 Hello Spring Security

Spring Security(新版本)实现权限认证与授权

Maven:Spring 4 + Spring Security

spring security 没有调用 loadUserByUsername() 方法