做过Java服务器端变成的同学们都知道鼎鼎大名的Spring。今天介绍一下Spring的安全框架,Spring Security。
Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架,基本包括了下列功能:
- 对身份验证和授权的全面和可扩展的支持
- 防止会话固定,点击劫持,跨站点请求伪造等攻击
- Servlet API集成
- 可选与Spring Web MVC集成
- 等等…...
接下来介绍一下今天的主题Spring Security 中的身份验证和访问控制。
身份验证和访问控制应用程序安全性基本可以归纳为两个重要的主题:身份验证(你是谁?)和授权(你可以做什么?)。也可以认为是“访问控制”而不是“授权”。
认证身份验证的主要策略接口AuthenticationManager只有一个方法:
public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }
一个 AuthenticationManager 主要能做3件事情:
- 如果输入的是有效的身份,验证成功,则返回Authentication(通常带有authenticated=true)。
- 如果输入的是无效的身份,则返回 AuthenticationException。
- 如果无法确定输入是否为有效身份,则返回null。
AuthenticationException属于运行时异常。例如,Web UI将呈现一个页面,表明身份验证失败,后端HTTP服务将发送401响应,有或没有WWW-Authenticate标头,具体取决于上下文。
最常用的实现AuthenticationManager接口的方法是ProviderManager,它委托给一组AuthenticationProvider实例。与AuthenticationManager类似,但是AuthenticationProvider有一个额外的方法 boolean supports() 允许调用者查询它是否支持给定的Authentication类型:
public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
方法supports()中的Class<?>参数是Class<? extends Authentication>。ProviderManager可以通过委托来支持同一个应用程序中的多个不同的身份验证机制AuthenticationProviders。如果ProviderManager无法识别特定的Authentication实例类型,则会跳过。
下图即为AuthenticationManager的层次结构
自定义身份验证管理器
Spring Security提供了一些配置帮助程序,可以快速获取应用程序中设置的常见身份验证管理器功能。最常用的帮助程序AuthenticationManagerBuilder,非常适合内存信息,JDBC或LDAP用户详细信息,或用于添加自定义UserDetailsService。以下是配置全局的应用程序示例AuthenticationManager:
@Configuration public class ApplicationSecurity extends WebSecurityConfigurerAdapter { ... // web stuff here @Autowired public initialize(AuthenticationManagerBuilder builder, DataSource dataSource) { builder.jdbcAuthentication().dataSource(dataSource).withUser("dave") .password("secret").roles("USER"); } }
Spring Boot提供了一个默认的全局AuthenticationManager,除非你通过提供自己的bean类型来抢占它AuthenticationManager。如果您执行任何构建的配置,而不必担心全局默认值。
授权/访问控制一旦身份验证成功,我们就可以继续授权,这里的核心策略是AccessDecisionManager。框架提供了三个实现,并且所有三个委托给一个链AccessDecisionVoter,有点像ProviderManager委托AuthenticationProviders。
一个AccessDecisionVoter考虑的Authentication(表示主体)和一个安全的Object,ConfigAttributes如下:
boolean supports(ConfigAttribute attribute); boolean supports(Class<?> clazz); int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes);
ConfigAttribute是一个接口,但它只有一个非常通用的方法并返回一个String,所以这些字符串以某种方式编码资源所有者的意图,表达允许谁访问它的规则。典型的ConfigAttribute是用户角色的名称(如ROLE_ADMIN或ROLE_AUDIT),它们通常具有特殊格式(如ROLE_ 前缀)或表示需要评估的表达式。
这里倒是与Tomcat中的Role 有点像。
今天的简单介绍先到这里,后续会有Spring Security的进一步介绍以及一些实例的介绍,欢迎关注。
,