我有一个独特的问题,我试图解决Spring Roo构建的网站,我最近添加了OpenID支持。我posted something on the Spring Forums,并试图尽我所能描述问题,但到目前为止我还没有得到任何帮助。
这是概要,我最好能描述一下。我正在使用的网站有一个简单的表单登录,使用Spring Security和JDBCUserDetailsService。我们还希望用户能够通过支持的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端获取该数据。我知道那里有人试图做类似的事情,但我找不到任何表明他们如何接近它的事情。
答案 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,但至少它现在正在工作。