# OpenID 支持

|   |OpenID1.0 和 2.0 协议已被弃用，并鼓励用户迁移到 Spring-security-oAuth2 支持的 OpenID Connect。|
|---|----------------------------------------------------------------------------------------------------------------------------------------------------------|

名称空间支持[OpenID](https://openid.net/)登录，而不是常规的基于表单的登录，或者除了基于表单的登录之外，只需要做一个简单的更改：

```
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<openid-login />
</http>
```

然后，你应该向 OpenID 提供者（例如 myopenid.com）注册自己，并将用户信息添加到内存`<user-service>`:

```
<user name="https://jimi.hendrix.myopenid.com/" authorities="ROLE_USER" />
```

你应该能够使用`myopenid.com`站点登录以进行身份验证。通过在`openid-login`元素上设置`user-service-ref`属性，也可以选择特定的`UserDetailsService` Bean 来使用 OpenID。请注意，我们在上面的用户配置中省略了 password 属性，因为这组用户数据仅用于为用户加载权限。将在内部生成一个随机密码，以防止你意外地将此用户数据用作配置中其他位置的验证源。

## 属性交换

支持 OpenID[属性交换](https://openid.net/specs/openid-attribute-exchange-1_0.html)。例如，下面的配置将试图从 OpenID 提供程序检索电子邮件和全名，以供应用程序使用：

```
<openid-login>
<attribute-exchange>
	<openid-attribute name="email" type="https://axschema.org/contact/email" required="true"/>
	<openid-attribute name="name" type="https://axschema.org/namePerson"/>
</attribute-exchange>
</openid-login>
```

每个 OpenID 属性的“type”都是一个 URI，由一个特定的模式决定，在本例中[https://axschema.org/](https://axschema.org/)。如果必须检索一个属性才能成功进行身份验证，则可以设置`required`属性。支持的确切模式和属性将取决于你的 OpenID 提供程序。属性值作为身份验证过程的一部分返回，之后可以使用以下代码对其进行访问：

```
OpenIDAuthenticationToken token =
	(OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
List<OpenIDAttribute> attributes = token.getAttributes();
```

我们可以从[SecurityContextholder ](architecture.html#servlet-authentication-securitycontextholder)中得到`OpenIDAuthenticationToken`。`OpenIDAttribute`包含属性类型和检索到的值（或者在多值属性的情况下的值）。你可以提供多个`attribute-exchange`元素，在每个元素上使用`identifier-matcher`属性。这包含一个正则表达式，它将与用户提供的 OpenID 标识符进行匹配。参见代码库中的 OpenID 示例应用程序，以获得配置示例，该配置为 Google、Yahoo 和 MyOpenID 提供者提供了不同的属性列表。

[记住我](rememberme.html)[Anonymous](anonymous.html)

