Добавление переменной ко всем представлениям в Grails - PullRequest
4 голосов
/ 13 ноября 2009

Я пытаюсь установить переменную для текущего пользователя (POJO) во всех представлениях, чтобы я мог получить такие вещи, как имя пользователя и проверить их роль в каждом представлении (включая макет по умолчанию). Как я могу настроить что-то (например, currentUser) в Grails, чтобы оно было доступно в каждом представлении Grails, например:

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

или как это:

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

Ответы [ 2 ]

11 голосов
/ 14 ноября 2009

Вы хотите использовать фильтр grails . Используя фильтр, вы можете указать, какие контроллеры и методы (используя подстановочные знаки) вы хотите перехватить, используя методы 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")
                }
            }
        }
    }    
}
4 голосов
/ 13 ноября 2009

Вы можете использовать область сеанса для хранения переменной. Ваши звонки изменятся на:

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

и

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

И вы должны установить переменную в контроллере так:

session.currentUser = XXXXX
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...