大多数情况下安全性都是一个超越了应用程序的横切关注点。Spring Security是一种基于 Spring AOP 和 Servlet 规范中的 Filter 实现的安全框架。
Spring Security 是为基于 Spring 的应用程序提供声明式安全保护的安全性框架。 Spring Security 提供了完整的安全性解决方案,它能够在 Web 请
求级别和方法调用级别处理身份认证和授权。因为基于 Spring 框架,所以 Spring Security 充分利用了依赖注入( dependency injection , DI )和
面向切面的技术。
1、使用Spring Security模块添加到类路径下,Spring Security 3.2 分为 11 个模块。
模 块 描 述
ACL 支持通过访问控制列表( access control list , ACL )为域对象提供安全性
切面( Aspects ) 一个很小的模块,当使用 Spring Security 注解时,会使用基于 AspectJ 的切面,而不是使用标准的 Spring AOP
CAS 客户端( CAS Client ) 提供与 Jasig 的中心认证服务( Central Authentication Service , CAS )进行集成的功能
配置( Configuration ) 包含通过 XML 和 Java 配置 Spring Security 的功能支持
核心( Core ) 提供 Spring Security 基本库
加密( Cryptography ) 提供了加密和密码编码的功能
LDAP 支持基于 LDAP 进行认证
OpenID 支持使用 OpenID 进行集中式认证
Remoting 提供了对 Spring Remoting 的支持
标签库( Tag Library ) Spring Security 的 JSP 标签库
Web 提供了 Spring Security 基于 Filter 的 Web 安全性支持
如果要使用Spring Security,必须引入Configuration和Core两个模块。如果是web项目需要引入Web模块,如果使用了jsp需要引入标签库。
2、过滤Web请求
Spring Security通过多个Servlet Filter实现的安全性。我们只需要在web.xml或者WebApplicationInitialize中配置一个filter即可。
DelegatingFilterProxy会将工作委托给一个注册在上下文中的Bean中。
在web.xml中配置
<!--DelegatingFilterProxy会将过滤逻辑委托给名为springSecurityFilterChain的Filter Bean-->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-calss>
</filter>
在WebApplicationInitializer中以java的方法配置
/**
AbstractSecurityWebApplicationInitializer实现了WebApplicationInitializer,Spring会发现他并且注册DelegatingFilterProxy。
我们可以重载appendFilters() 或 insertFilters()方法自己添加别的Filter,但是DelegatingFilterProxy的注册我们什么也不用做。
*/
public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer{}
注意:无论使用哪种配置方式,他们都会连接发往应用的请求,并将讲求委托给ID为springSecurityFilterChain的Bean。
SpringSecurityFilterChain是一个特殊的Filter它连接了其他的Filter(各有各的作用)。这些Filter会在启用安全的时候会启用。
3、编写简单的安全配置
Spring Security 在早期版本中配置非常繁琐。Spring Security2.0之后简单了一些。Spring3.0引入了java的配置方案。下面是使用java最简单的配置
/**
Spring中任何实现了WebSecurityConfigurer的类都可以作为Spring Security的配置配。但是下面这种方法是最简单的。
@EnableWebSecurity可以启动web安全性。
但是如果使用的是SpringMVC那么你需要使用@EnableWebMvcSecurity注解。该注解还配置了Spring MVC的参数解析器
这两种方法都会造成应用的锁定,导致任何人不能访问系统。
*/
@configuration
@EnableWebSecurity //启用Web安全性
public class SecurityConfig extends WebSecurityConfigurerAdapter{}
指定Web安全的细节
通过重载WebSecurityConfigurerAdapter中的configure方法实现:
方 法 描 述
configure(WebSecurity) 通过重载,配置 Spring Security 的 Filter 链
configure(HttpSecurity) 通过重载,配置如何通过拦截器保护请求
configure(AuthenticationManagerBuilder) 通过重载,配置 user-detail 服务
/**
下面配置指点了保护http请求的方案,和客户端认证用户的方案。
通过调用authorizeRequests()和anyRequest().authenticated()就会要求所有进入应用的Http请求都需要认证。
但是没有重写configure(AuthenticationManagerBuilder)方法,导致没有用户可以认证。
*/
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests().anyRequest().authenticated().add().formLogin().and().httpBasic();
}
为了满足我们的要求需要:
1:配置用户存储
2:指定那些请求需要认证,那些不需要认证,以及需要的权限。
3:提供一个自定义的登录界面,替代原来简单的默认登录页。
????????????????????????????????????????????????????????????????
后续内容待续。。。