# OpenID 支持

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

名称空间支持OpenID (opens new window)登录,而不是常规的基于表单的登录,或者除了基于表单的登录之外,只需要做一个简单的更改:

<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属性交换 (opens new window)。例如,下面的配置将试图从 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/ (opens new window)。如果必须检索一个属性才能成功进行身份验证,则可以设置required属性。支持的确切模式和属性将取决于你的 OpenID 提供程序。属性值作为身份验证过程的一部分返回,之后可以使用以下代码对其进行访问:

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

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

记住我Anonymous