我是grails的新手并试图用以下方式显示用户的名字:“shiro:principal property =”firstName“
但是它给了我以下错误:
Error executing tag 'shiro:principal': No such property: firstName for class: java.lang.String
如果我只是使用“shiro:principal”,它会打印用户名,但我需要名字。
域类看起来像这样:
class ShiroUser {
String firstName
String lastName
String username
感谢您的帮助!
答案 0 :(得分:3)
在我看来,您可能必须包含type="ShiroUser"
,以便它获得具有正确类的主体。
因此,您的GSP代码为<shiro:principal type="ShiroUser" property="firstName" />
<强>更新强>
我看过我们的代码,结果发现我们没有使用这个功能(我以为我们做过)。我们实际上编写了自己的标记库来实现您的要求。那么也许这对我们来说也是一个问题?
所以这是我们创建的标记库: UserTagLib.groovy
def loggedInUser = { attrs, body ->
def user = _currentUser()
if (!user) return
def prop = user[attrs.property]
if (prop) out << prop.encodeAsHTML()
}
def _currentUser() {
def principal = SecurityUtils.subject?.principal
if (!principal) return // No-one logged-in
return User.get(principal)
}
示例用法:
<user:loggedInUser property="fullName"/>
答案 1 :(得分:1)
基于@David发布的内容,我能够让它对我有用。这就是我所做的:
package myproject
import com.somepackage.ShiroUser
import org.apache.shiro.SecurityUtils
class UserTagLib {
static defaultEncodeAs = [taglib:'html']
//static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']]
static namespace = "user"
def loggedInUser = { attrs, body ->
def user = _currentUser()
if (!user) return
def prop = user[attrs.property]
if (prop) out << prop.encodeAsHTML()
}
def _currentUser() {
def subject = SecurityUtils.subject
if (!subject.getPrincipal()) return // No-one logged-in
return User.findByUsername(subject.getPrincipal().toString())
}
}
(修改后的部分位于_currentUser()
)
然后在视图中:
...
<div class="someClass">
<shiro:isLoggedIn>Hello, <user:loggedInUser property="fullName"/> </shiro:isLoggedIn>
</div>
...