认证服务(Authentication Service)

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

在 Spring Security 3.0 之前,AuthenticationManager 是在内部自动注册的。现在你必须使用 <authentication-manager> 元素明确地注册一个。这将创建一 个Spring Security 的 ProviderManager 类的实例,它需要用一个或多个 AuthenticationProvider 实例的列表来配置。这些实例可以使用命名空间提供的语法元素来创建,也可以是标准的Bean定义,使用 authentication-provider 元素来标记添加到列表中。

<authentication-manager>

每个使用命名空间的 Spring Security 应用程序都必须在某个地方包含这个元素。它负责注册为应用程序提供认证服务的 AuthenticationManager。所有创建 AuthenticationProvider 实例的元素都应该是这个元素的子元素。

<authentication-manager> 属性

  • alias 这个属性允许你为内部实例定义一个别名,以便在你自己的配置中使用。

  • erase-credentials 如果设置为 "true",一旦用户被认证,AuthenticationManager 将尝试清除返回的 Authentication 对象中的任何凭证数据。从字面上看,它映射到 ProviderManagereraseCredentialsAfterAuthentication 属性。

  • observation-registry-ref 对用于 FilterChain 和相关组件的 ObservationRegistry 的引用。

  • id 这个属性允许你为内部实例定义一个id,以便在你自己的配置中使用。它与alias元素相同,但为使用id属性的元素提供了更一致的体验。

<authentication-manager> 的子元素

<authentication-provider>

除非与 ref 属性一起使用,这个元素是配置 DaoAuthenticationProvider 的简写。 DaoAuthenticationProviderUserDetailsService 加载用户信息,并将用户名/密码组合与登录时提供的值进行比较。UserDetailsService 实例可以通过使用可用的命名空间元素(jdbc-user-service 或使用 user-service-ref 属性来指向在 application context 中定义的bean)来定义。

<authentication-provider> 的父元素

<authentication-provider> 属性

  • ref 定义一个对实现 AuthenticationProvider 的 Spring Bean 的引用。

如果你已经写了你自己的 AuthenticationProvider 实现(或者由于某种原因想把Spring Security自己的一个实现配置成一个传统的bean,那么你可以使用下面的语法把它添加到 ProviderManager 的内部列表。

<security:authentication-manager>
  <security:authentication-provider ref="myAuthenticationProvider" />
</security:authentication-manager>
<bean id="myAuthenticationProvider" class="com.something.MyAuthenticationProvider"/>
  • user-service-ref 对实现 UserDetailsService 的 Bean 的引用,可以使用标准 Bean 元素或自定义 user-service 元素创建。

<authentication-provider> 的子元素

<jdbc-user-service>

这会创建一个基于 JDBC 的 UserDetailsService

<jdbc-user-service> 属性

  • authorities-by-username-query

一个SQL语句,用于查询一个用户的授予权限,给定一个用户名。

默认的是:

select username, authority from authorities where username = ?
  • cache-ref 定义一个对缓存的引用,以便与 UserDetailsService 一起使用。

  • data-source-ref 提供所需表的数据源的Bean ID。

  • group-authorities-by-username-query 一个SQL语句,用于查询给定用户名的用户组权限。默认是:

    select
    g.id, g.group_name, ga.authority
    from
    groups g, group_members gm, group_authorities ga
    where
    gm.username = ? and g.id = ga.group_id and g.id = gm.group_id
  • id 一个Bean标识符,用于在 context 中引用该Bean的其他地方。

  • role-prefix 一个非空的字符串前缀,将被添加到从持久性存储加载的角色字符串中(默认为 "ROLE_")。在默认值为非空的情况下,使用值 "none" 表示没有前缀。

  • users-by-username-query 一个SQL语句,用于查询用户名、密码和启用状态,给定一个用户名。默认是

    select username, password, enabled from users where username = ?

<password-encoder>

认证提供者可以选择性地配置为使用密码编码器,如 密码存储 中所述。这将导致Bean被注入适当的 PasswordEncoder 实例。

<password-encoder> 的父元素

<password-encoder> 属性

  • hash 定义用于用户密码的散列(hash)算法。我们强烈建议不要使用MD4,因为它是一种非常弱的散列(hash)算法。

  • ref 定义了一个对实现 PasswordEncoder 的 Spring Bean 的引用。

<user-service>

从一个 properties 文件或一个 "user" 子元素的列表中创建一个内存中的 UserDetailsService。用户名在内部被转换为小写字母,以便进行不区分大小写的查找,所以如果需要区分大小写,就不应该使用这个。

<user-service> 属性

  • id 一个Bean标识符,用于在 context 中引用该Bean的其他地方。

  • properties 一个 Properties 文件的位置,其中每一行的格式为

    username=password,grantedAuthority[,grantedAuthority][,enabled|disabled]

<user-service> 的子元素

<user>

代表应用程序中的一个用户。

<user> 的父元素

<user> 属性

  • authorities 授予该用户的一个或多个权限。用逗号分隔权限(但没有空格)。例如,"ROLE_USER,ROLE_ADMINISTRATOR"

  • disabled 可以设置为 "true",将一个账户标记为禁用和不可用。

  • locked 可以设置为 "true",将一个账户标记为锁定和不可用。

  • name 分配给该用户的用户名。

  • password 分配给用户的密码。如果相应的认证提供者支持散列(hash),这可以是散列(hash)的(记住要设置 "user-service" 元素的 "hash" 属性)。如果数据不用于认证,而只用于访问权限,则可以省略该属性。如果省略,命名空间将生成一个随机值,防止其意外地用于认证。不能为空。