Пространство имен поддерживает вход в систему с помощью 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.