Spring Security 模块划分
- 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安全性支持
Application 的classpath里面至少要包含Core和Configuration这两个模块
简单配置Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{}
任何实现WebSecurityConfigure的类都可以用来配置Spring Security , 但是通常我们使用更简单的方式:扩展WebSecurityConfigure的实现类WebSecurityConfigurerAdapter。
具体的配置可以通过重写WebSecurityConfigurerAdapter的configure()方法来实现,下面是三个方法的功能:
- configure(HttpSecurity) //通过重载,配置如何通过拦截器保护请求
- configure(WebSecurity) //通过重载,配置Spring Security的Filter链
- configure(AuthenticationManagerBuilder) //通过重载,配置user-detail服务
Demo Code:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**","/bower_components/**","/config/**","/controllers/**","/service/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.permitAll()
.and()
.rememberMe()
.and()
.logout()
.permitAll()
.and()
.csrf()
.disable();
}
SPEL
Spring Security通过一些安全性相关的表达式扩展了Spring表达式语言
- authentication // 用户的认证对象
- denyAll // 结果始终未false
- hasAnyRole(list of roles) // 如果用户被授予了列表中任意的指定角色,结果为true
- hasRole(role) // 如果用户被授予了指定的角色,结果为true
- hasIPAddress(IP Address) // 如果请求来自指定IP的话,结果为true
- isAnonymous() // 如果当前用户为匿名用户,结果为true
- isAuthenticated() // 如果当前用户进行了认证的话,结果为true
- isFullyAuthenticated() // 如果当前用户进行了完整认证的话(不是通过Remember-me功能进行的认证),结果为true
- isRememberMe() // 如果当前用户是通过Remember-me自动认证的,结果为true
- permitAll // 结果始终为true
- principal // 用户的principal对象
spELl的特点就是可以对各种控制进行自由的搭配,比如下面这个
http.authorizeRequests()
.regexMatchers("/*")
.access("hasRole('ROLE_ADMIN') and hasIpAddress('192.168.1.2')");