spring security 认证管理器(SpringSecurity-)(1)

做过Java服务器端变成的同学们都知道鼎鼎大名的Spring。今天介绍一下Spring的安全框架,Spring Security。

Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架,基本包括了下列功能:

接下来介绍一下今天的主题Spring Security 中的身份验证和访问控制。

身份验证和访问控制

应用程序安全性基本可以归纳为两个重要的主题:身份验证(你是谁?)和授权(你可以做什么?)。也可以认为是“访问控制”而不是“授权”。

认证

身份验证的主要策略接口AuthenticationManager只有一个方法:

public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }

一个 AuthenticationManager 主要能做3件事情:

  1. 如果输入的是有效的身份,验证成功,则返回Authentication(通常带有authenticated=true)。
  2. 如果输入的是无效的身份,则返回 AuthenticationException。
  3. 如果无法确定输入是否为有效身份,则返回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 认证管理器(SpringSecurity-)(2)

自定义身份验证管理器

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的进一步介绍以及一些实例的介绍,欢迎关注。

,