0

我有一个独特的问题,我正在尝试使用我最近添加了 OpenID 支持的 Spring Roo 构建的站点来解决。我在 Spring Forums 上发布了一些内容,并尽我所能描述了这个问题,但到目前为止我还没有得到任何帮助。

这是概要,尽我所能描述。我正在处理的站点有一个简单的表单登录,使用 Spring Security 和 JDBCUserDetailsS​​ervice。我们还希望用户能够通过受支持的 OpenID 登录,因此使用Spring Security 示例来实现带自动注册的 OpenID ,我们修改了站点代码以允许简单表单和 OpenID 登录。UserDetails 仍然来自数据库,唯一的区别是 OpenID 用户 ID 是从 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 不在页面上下文中(即用户未登录),则显示登录名,否则打印出带有用户名的漂亮“欢迎...”。此代码不需要控制器代码中的特殊规定即可运行:用户是否已登录。

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

我想过向存储在数据库中的用户对象添加一个“别名”字段(恰好是 UserDetails 的一个实例,fwiw),并允许用户自己设置它,但我不知道如何去做以“通用”方式从 JSPX 端获取数据。我知道外面有人正在尝试做类似的事情,但我无法找到任何可以显示他们如何接近它的东西。

4

1 回答 1

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 和 alias 不为空,但至少它现在可以工作了。

于 2012-07-04T14:17:25.933 回答