У меня есть уникальная проблема, которую я пытаюсь решить с сайтом, созданным Spring Roo, для которого я недавно добавил поддержку OpenID. Я запостил что-то на Spring Forums и попытался описать проблему в меру своих возможностей, но пока никакой помощи не получил.
Вот синопсис, насколько я могу его описать. Сайт, над которым я работаю, имел простую форму входа в систему с использованием Spring Security и JDBCUserDetailsService. Мы также хотели, чтобы пользователи могли входить в систему через поддерживаемый OpenID, поэтому с помощью Примеры Spring Security для реализации OpenID с автоматической регистрацией мы изменили код нашего сайта, чтобы разрешить как простая форма, так и логин OpenID. UserDetails по-прежнему поступает из базы данных, с той лишь разницей, что идентификатор пользователя OpenID представляет собой полную строку URL-адреса аутентификации, переданную обратно от поставщика OpenID.
Проблема, с которой я сталкиваюсь, заключается в нашем коде заголовка. У нас был простой код JSPX, который делал следующее:
<c:choose>
<c:when test="${pageContext['request'].userPrincipal == null}">
<span>
<form method="post" action="${login}" name="login_form" id="login_form">
<input name="j_username" type="text" id="j_username" />
<input name="j_password" type="password" id="j_password" />
<input name="submit" type="submit" id="proceed" />
</form>
</span>
<span>or <a href="${registration_form}">Register</a></span>
</c:when>
<c:otherwise>
<span>Hello, <a href="${user_profile_base}${pageContext['request'].userPrincipal.name}"><img src="${user_img_url}" width='10' height='10' />${pageContext['request'].userPrincipal.name}</a></span> | <a href="${logout}">Logout</a>
</c:otherwise>
</c:choose>
По сути, если пользователь Principal не находится в контексте страницы (т. е. пользователь не вошел в систему), тогда отобразите логин для, в противном случае распечатайте приятное «Добро пожаловать ...» с именем пользователя. Этот код не требовал специальных условий в коде контроллера для работы: либо пользователь вошел в систему, либо нет.
Теперь проблема с пользователями OpenID. Имя пользователя больше не является красивой строкой, определяемой пользователем. Вместо этого это длинная строка URL-адреса, которая может содержать или не содержать где-то понятное пользователю имя идентификатора (например, у Google есть какая-то туманная строка, похожая на GUID).
Я подумал о том, чтобы добавить поле «Псевдоним» к объекту пользователя, хранящемуся в БД (который является экземпляром UserDetails, fwiw), и позволить пользователю установить его самостоятельно, но я не знаю, как это сделать данные со стороны JSPX "общим" способом. Я знаю, что кто-то пытается сделать что-то подобное, но я не смог найти ничего, показывающего, как они подошли к этому.