自动填充模型,包含所有@Controller的用户信息

时间:2012-07-04 13:07:25

标签: spring-mvc spring-security openid spring-roo

我有一个独特的问题,我试图解决Spring Roo构建的网站,我最近添加了OpenID支持。我posted something on the Spring Forums,并试图尽我所能描述问题,但到目前为止我还没有得到任何帮助。

这是概要,我最好能描述一下。我正在使用的网站有一个简单的表单登录,使用Spring Security和JDBCUserDetailsS​​ervice。我们还希望用户能够通过支持的OpenID登录,因此使用Spring Security examples for implementing OpenID w/ auto-registration我们修改了站点代码以允许简单表单和OpenID登录。 UserDetails仍然来自数据库,唯一的区别是OpenID userid是从OpenID提供程序传回的完整身份验证URL字符串。

我遇到的问题是我们的标题代码。我们有一些简单的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不在页面上下文中(即用户未登录),则显示登录名,否则使用用户的用户名打印出漂亮的“Welcome ...”。此代码不需要控制器代码中的特殊规定即可运行:用户是否已登录。

现在问题出在OpenID用户身上。用户名不再是用户定义的好字符串。相反,它的长URL字符串可能包含或不包含用户可读的ID名称(例如,Google有一些看起来像GUID的模糊字符串)。

我考虑过将“Alias”字段添加到存储在DB中的用户对象(恰好是UserDetails的实例,fwiw),并允许用户自己设置,但我不知道如何以“通用”方式从JSPX端获取该数据。我知道那里有人试图做类似的事情,但我找不到任何表明他们如何接近它的事情。

1 个答案:

答案 0 :(得分:0)

无论出于何种原因,问题都是

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

正在返回org.springframework.security.openid.OpenIDAuthenticationToken的实例。在阅读JavaDoc时,我发现我可以先获取实际的Principal对象,然后调用我的Alias getter,如下所示:

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

这按预期工作。我可能需要做一些额外的检查以确保Principal和别名不为null,但至少它现在正在工作。

相关问题