# 认证服务

这将创建 Spring Security 的ProviderManager类的实例,该实例需要配置一个或多个AuthenticationProvider实例的列表。这些可以使用名称空间提供的语法元素创建,也可以是标准 Bean 定义,标记为使用authentication-provider元素添加到列表中。

# <authentication-manager>

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

# <authentication-manager>属性

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

  • 擦除凭据如果设置为 true,则一旦用户通过身份验证,身份验证管理器将尝试清除返回的身份验证对象中的任何凭据数据。从字面上看,它映射到[eraseCredentialsAfterAuthentication][ProviderManager](.../authentication/architecture.html# Servlet-authentication-providermanager)的eraseCredentialsAfterAuthentication属性。

  • 身份证此属性允许你为内部实例定义一个 ID,以便在你自己的配置中使用。它与 Alias 元素相同,但是对于使用 ID 属性的元素提供了更一致的体验。

# <authentication-manager>的子元素

# <authentication-provider>

除非与ref属性一起使用,否则此元素是用于配置DaoAuthenticationProvider的简写。DaoAuthenticationProviderUserDetailsService加载用户信息,并将用户名/密码组合与登录时提供的值进行比较。UserDetailsService实例可以通过使用可用的名称空间元素(jdbc-user-service)或通过使用user-service-ref属性指向应用程序上下文中其他地方定义的 Bean 来定义。

# <authentication-provider>的父元素

# <authentication-provider>属性

  • 参考定义了对实现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 **对实现可使用标准 Bean 元素或自定义用户服务元素创建的 UserDetailsService 的 Bean 的引用。

# <authentication-provider>的子元素

# <jdbc-user-service>

导致创建基于 JDBC 的 UserDetailsService。

# <jdbc-user-service>属性

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

默认值是

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

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

  • 组-权限-按用户名-查询一个 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
    
  • 身份证 Bean 标识符,用于在上下文的其他地方引用 Bean。

  • 角色前缀一个非空的字符串前缀,它将被添加到从持久存储加载的角色字符串中(默认为“role_”)。在默认值为非空的情况下,使用值“none”表示无前缀。

  • 用户按用户名查询查询用户名、密码和给定用户名的已启用状态的 SQL 语句。默认值是

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

# <password-encoder>

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

# <password-encoder>的父元素

# <password-encoder>属性

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

  • 参考定义了对实现PasswordEncoder的 Spring Bean 的引用。

# <user-service>

从属性文件或“用户”子元素列表创建内存中的 UserDetailsService。用户名在内部被转换为小写字母,以允许不区分大小写的查找,因此如果需要区分大小写,则不应使用这种方法。

# <user-service>属性

  • 身份证一个 Bean 标识符,用于在上下文的其他地方引用 Bean。

  • 属性属性文件的位置,其中每行的格式为

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

# <user-service>的子元素

# <user>

表示应用程序中的用户。

# <user>的父元素

# <user>属性

  • 当局授予用户的多个权限之一。用逗号(但没有空格)分隔权限。例如,“role_user,role_administrator”

  • 已禁用可以设置为“true”,以将帐户标记为禁用和不可用。

  • 锁定可以设置为“true”,以标记帐户为锁定和不可用。

  • 姓名分配给用户的用户名。

  • 密码分配给用户的密码。如果相应的身份验证提供程序支持散列(请记住设置“user-service”元素的“hash”属性),则可能会进行散列。如果数据不用于身份验证,而仅用于访问权限,则省略此属性。如果省略,命名空间将生成一个随机值,从而防止意外地将其用于身份验证。不能是空的。

XML 命名空间网络安全