我想通过快速链接为登录用户提供编辑其用户帐户的可能性。
为此,我使用正确的GSP标记创建了一个链接,并且我想使用正确的帮助程序从Spring Security UserDetails对象传递用户ID。
问题是,当我在GSP标签中时,这就像在编辑我的用户之后,但在id属性中不是我真正需要它的地方。
<g:link controller="user" action="show" id="${sec.loggedInUserInfo(field: "id")}">
Edit my User ${sec.loggedInUserInfo(field: "id")}
</g:link>
预期:
<a href="/Backoffice/user/show/1"> Edit my User 1 </a>
错误的结果:
<a href="/Backoffice/user/show"> Edit my User 1 </a>
安全标记库访问的UserDetails类位于:
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
import org.springframework.security.core.GrantedAuthority
class UserDetails extends GrailsUser {
final String displayName
final String email
final String gravatarImage
...
ID在GrailsUser基类中定义为Object。
类GrailsUser扩展了用户{
private final Object _id
...
}
将在此处编码为HTML:
/**
* Renders a property (specified by the 'field' attribute) from the principal.
*
* @attr field REQUIRED the field name
*/
def loggedInUserInfo = { attrs, body ->
// TODO support 'var' and 'scope' and set the result instead of writing it
String field = assertAttribute('field', attrs, 'loggedInUserInfo')
def source
if (springSecurityService.isLoggedIn()) {
source = determineSource()
for (pathElement in field.split('\\.')) {
source = source."$pathElement"
if (source == null) {
break
}
}
}
if (source) {
out << source.encodeAsHTML()
}
else {
out << body()
}
}
有趣的是:这是有效的。但是我真的想为链接使用一致的gsp语法,我想理解为什么发布在顶部的代码不起作用。
<a href="${createLink( controller : "user", action : "show", id : sec.loggedInUserInfo(field: "id"))}">Edit my User</a>
答案 0 :(得分:7)
看起来错误的引用 - 您需要在"
内转义id="..."
。为简单起见,请尝试使用field: 'id'
代替field: "id"
。
答案 1 :(得分:0)
您需要将id作为参数传递,您只需为您的链接指定ID ..
<g:link controller="user" action="show" params="[id:${sec.loggedInUserInfo(field: "id")}]" id="${sec.loggedInUserInfo(field: "id")}">
Edit my User ${sec.loggedInUserInfo(field: "id")}
</g:link>
使用firebug查看g:link ...
的确切渲染html