# 认证服务

这将创建 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\>的子元素

* [身份验证提供者](#nsa-authentication-provider)

* [LDAP-身份验证-提供者](ldap.html#nsa-ldap-authentication-provider)

## \<authentication-provider\>

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

### \<authentication-provider\>的父元素

* [身份验证管理器](#nsa-authentication-manager)

### \<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-用户服务](#nsa-jdbc-user-service)

* [LDAP-用户服务](ldap.html#nsa-ldap-user-service)

* [密码编码器](#nsa-password-encoder)

* [用户服务](#nsa-user-service)

## \<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\>

身份验证提供者可以可选地被配置为使用[密码存储](../../../features/authentication/password-storage.html#authentication-password-storage)中所述的密码编码器。这将导致 Bean 被注入适当的`PasswordEncoder`实例。

### \<password-encoder\>的父元素

* [身份验证提供者](#nsa-authentication-provider)

* [密码-比较](#nsa-password-compare)

### \<password-encoder\>属性

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

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

## \<user-service\>

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

### \<user-service\>属性

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

* **属性**属性文件的位置，其中每行的格式为

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

### \<user-service\>的子元素

* [user](#nsa-user)

## \<user\>

表示应用程序中的用户。

### \<user\>的父元素

* [用户服务](#nsa-user-service)

### \<user\>属性

* **当局**授予用户的多个权限之一。用逗号（但没有空格）分隔权限。例如，“role\_user，role\_administrator”

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

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

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

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

[XML 命名空间](index.html)[网络安全](http.html)

