如何用shiro显示grails中用户的名字

时间:2014-08-27 04:33:18

标签: grails shiro principal

我是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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您可以在此处查看代码:https://github.com/pledbrook/grails-shiro/blob/master/grails-app/taglib/org/apache/shiro/grails/ShiroTagLib.groovy#L119

在我看来,您可能必须包含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>

...