作者:before31 https:// my.oschina.net/xuezi/bl og/3126351
本指南是Spring Security的入门,它提供了对该框架的设计和基本构建的见解。我们仅介绍了应用程序安全性的最基本知识,但是这样做可以解除使用Spring Security的开发人员所遇到的一些困惑。为此,我们会看一下使用过滤器(更通常是使用方法注释)在Web应用程序中应用安全性的方式。当你需要从高层次了解安全应用程序的工作方式,如何自定义它,或者仅需要学习如何考虑应用程序安全性时,请使用本指南。
本指南并不是解决最基本问题的手册(对于基本问题,有很多其他可参考的资料),但对于初学者和专家都可能有用。 Spring Boot也被提及了很多次,因为它为安全的应用程序提供了一些默认行为,并且理解它与整个体系结构之间的关系会对你很有帮助。所有这些原则同样适用于不使用Spring Boot的应用程序。
身份认证和访问控制(Authentication and Access Control)
应用程序安全性差不多可以归结为两个独立的问题:身份认证(你是谁)和授权(authorization)(你可以做什么?)。 有时人们会说“访问控制”而不是“授权”,这可能会造成困惑,但是以这种方式思考可能会有所帮助,因为“授权”在其他地方又有其他含义。 Spring Security的体系结构旨在将身份认证与授权分开,并且具有许多策略和扩展点。
身份认证
认证的主要策略接口是AuthenticationManager
,该接口只有一个方法:
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
在AuthenticationManager接口的authenticate()方法中可以有3种处理情况:
- 如果认证成功,则返回一个Authentication对象(通常将其authenticated属性设置为true)。
- 如果认证失败,则抛出AuthenticationException异常。
- 果无法判断成功或失败,则返回null。
AuthenticationException
是运行时异常。它通常由应用程序以通用方式处理,具体取决于应用程序的风格或目的。 换句话说,通常不希望用户代码捕获并处理它。 例如,一个Web UI将呈现一个页面,该页面说明身份验证失败,而后端HTTP服务将发送401响应,是否携带WWW-Authenticate标头则取决于上下文。
AuthenticationManager最常用的实现是ProviderManager
,它委派了AuthenticationProvider实例链。AuthenticationProvider有点像AuthenticationManager,但是它还有一个额外的方法,允许调用者查询是否支持给定的Authentication类型:
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
boolean supports(Class<?> authentication);
}
supports()
方法中的Class<?>
参数实际上是Class<? extends Authentication>
(仅会询问它是否支持将传递到authenticate()方法中的内容)。 通过委派给AuthenticationProviders链,ProviderManager可以在同一应用程序中支持多种不同的身份验证机制。 如果ProviderManager无法识别特定的身份验证实例类型,则将跳过该类型。
ProviderManager具有可选的父级,如果所有提供程序都返回null,则可以咨询该父级。 如果父级不可用,则空的Authentication将导致AuthenticationException。
有时,应用程序具有逻辑组的受保护资源(例如,与路径模式/api/**
匹配的所有Web资源),并且每个组可以具有自己的专用AuthenticationManager。 通常,每一个都是ProviderManager,它们共享一个父级。 因此,父级是一种“全局”资源,充当所有providers的后备。
使用ProviderManager的AuthenticationManager层次结构
定制Authentication Managers
Spring Security提供了一些配置助手,可以快速获取在应用程序中设置的通用Authentication Managers功能。 最常用的帮助程序是AuthenticationManagerBuilder,它非常适合设置内存中、JDBC或LDAP用户详细信息,或添加自定义UserDetailsService。这是配置全局(父)AuthenticationManager的应用程序的示例