Я хочу дать зарегистрированному пользователю возможность редактировать свою учетную запись пользователя с помощью быстрой ссылки.
Для этого я создал ссылку, используя правильный тег GSP, и хочу передать идентификатор пользователя из объекта Spring Security UserDetails, используя правильный помощник.
Проблема в том, что это работает, когда я нахожусь в теге GSP, как после Edit my User, но не там, где он мне действительно нужен, в атрибуте 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, к которому тег Lib имеет доступ, находится здесь:
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
...
Идентификатор определяется как объект в базовом классе GrailsUser.
класс 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>