Протоколы OpenID 1.0 и 2.0 устарели, поэтому пользователям рекомендуется перейти на OpenID Connect, который поддерживается spring-security-oauth2.

Пространство имен поддерживает вход в систему с помощью OpenID вместо или в дополнение к обычному входу в систему через форму, для чего требуется внести лишь небольшое изменение:

<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 для аутентификации. Также можно выбрать конкретный бин UserDetailsService для использования OpenID, установив атрибут user-service-ref в элементе openid-login. Обратите внимание, что мы опустили атрибут пароля из приведенной выше пользовательской конфигурации, поскольку этот набор пользовательских данных используется только для того, чтобы загрузить полномочия для пользователя. Пароль будет сгенерирован на внутреннем уровне случайным образом, что предотвратит неумышленное использование этих пользовательских данных в качестве источника аутентификации в других местах конфигурации.

Обмен атрибутами

Поддержка обмена атрибутами в OpenID. В качестве примера в следующая конфигурация попытаемся получить адрес электронной почты и полное имя от поставщика 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 – это URI, определяемый конкретной схемой, в данном случае https://axschema.org/. Если атрибут нужно получить для успешной аутентификации, можно установить required атрибут. Точная схема и поддерживаемые атрибуты зависят от вашего поставщика OpenID. Значения атрибутов возвращаются в качестве компонента процесса аутентификации, а после этого доступ к ним можно получить с помощью следующего кода:

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

Мы можем получить OpenIDAuthenticationToken из SecurityContextHolder. OpenIDAttribute содержит тип атрибута и извлекаемое значение (или значения в случае многозначных атрибутов). Вы можете передать несколько элементов attribute-exchange, используя атрибут identifier-matcher для каждого из них. Содержит регулярное выражение, которое будет сопоставлено с идентификатором OpenID, передаваемым пользователем. Пример конфигурации см. в кодовой базе для примера приложения OpenID, в котором представлены различные списки атрибутов для поставщиков Google, Yahoo и MyOpenID.