Автоматическое заполнение модели информацией о пользователе для всех @Controller

У меня есть уникальная проблема, которую я пытаюсь решить с сайтом, созданным 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 "общим" способом. Я знаю, что кто-то пытается сделать что-то подобное, но я не смог найти ничего, показывающего, как они подошли к этому.


person CodeChimp    schedule 04.07.2012    source источник


Ответы (1)


Проблема заключалась в том, что по какой-то причине звонки

${user_profile_base}${pageContext['request'].userPrincipal

возвращал экземпляр org.springframework.security.openid.OpenIDAuthenticationToken. Читая JavaDoc, я обнаружил, что могу сначала получить фактический объект Principal, а затем вызвать мой геттер Alias, например:

${user_profile_base}${pageContext['request'].userPrincipal.principal.alias

Это работает, как и ожидалось. Вероятно, мне нужно выполнить дополнительную проверку, чтобы убедиться, что принципал и псевдоним не равны нулю, но, по крайней мере, сейчас это работает.

person CodeChimp    schedule 04.07.2012