3

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

感谢您的帮助!

4

2 回答 2

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"/>

于 2014-08-27T06:26:48.913 回答
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>

...
于 2015-03-10T02:15:42.293 回答