将变量添加到grails中的所有视图

时间:2009-11-13 09:00:28

标签: grails

我正在尝试在所有视图中为当前用户(POJO)设置一个变量,这样我就可以获得用户名之类的内容,并检查每个视图上的角色(包括默认布局)。如何在grails中设置某些内容(例如currentUser),以便在每个grails视图中都可以访问它,如下所示:

<div>${currentUser.name}</div>

或者像这样:

<g:if test="${currentUser.admin}">ADMIN</g:if>

2 个答案:

答案 0 :(得分:11)

您想使用grails filter。使用过滤器,您可以使用before / after和afterView方法指定要拦截的控制器和方法(使用通配符)。

这样可以很容易地将新变量填充到模型中,以便在视图中可用。这是一个使用acegi插件authenticateService的例子:

class SecurityFilters {

    def authenticateService

    def filters = {
        all(controller:'*', action:'*') {
            after = { model ->
                def principal = authenticateService.principal()
                if (principal != null && principal != 'anonymousUser') {
                    model?.loggedInUser = principal?.domainClass
                    log.debug("SecurityFilter: adding current user to model = $model")
                } else {
                    log.debug("SecurityFilter: anonymous user, model = $model")
                }
            }
        }
    }    
}

答案 1 :(得分:4)

您可以使用会话范围来存储变量。您的来电将更改为:

<div>${session.currentUser.name}</div>

<g:if test="${session.currentUser.admin}">ADMIN</g:if>

你可以在控制器中设置这样的变量:

session.currentUser = XXXXX