Grails在运行时更新/重新呈现布局

时间:2013-12-16 23:06:51

标签: grails layout spring-security

情况是我有一个布局application.gsp,它定义了除登录页面之外的所有页面的布局。布局内部是一个标题,应该显示当前登录用户的名称(Spring Security插件)。问题是,如果用户第一次注册或使用oAuth(与注册相同),那么当他登录时,他将看到并清空点而不是用户名,因为布局在之前呈现用户名可用。如果他再次登出/登录,他当然会看到他的用户名。

P.S。将标题移到布局之外不是一种选择,因为它会导致大量的代码重复。

有解决方法吗?

3 个答案:

答案 0 :(得分:1)

我将为后代试图解决同样的问题回答我自己的问题 诀窍是使用装饰器设计模式和记录错误的 g:pageProperty gsp标签。

视图/布局/ application.gsp

....
<li class="dropdown menu">
                        <a href="#" class="dropdown-toggle"
                           data-toggle="dropdown"><g:pageProperty name="page.username"/></a>
                        <ul class="dropdown-menu">
                            <li>Preferences</li>
                            <li>
                                <a href="${resource(file: 'j_spring_security_logout')}"
                                   class="navbar-btn btn-danger btn">Logout</a></li>
                        </ul>
                    </li>
....

视图/ index.gsp中:

....
<body>
    <content tag="username">
        <g:username username="${username}"/>
    </content>
....

标签库/ UsernameTagLib.groovy:

class UsernameTagLib {
def springSecurityService

/**
 * Check if the username is already available, else inject newly created username into the layout
 *
 * @attr username REQUIRED that was received from the newly registered user
 */
def username = { attrs ->
    String currentUsername = springSecurityService.getCurrentUser()?.username
    if (currentUsername) {
        out << currentUsername
    } else {
        out << attrs.username
    }
  }
}

当用户完成整个oAuth流程时,新创建的用户名将传递给 views / index.gsp

控制器/ OauthCallBackController.groovy

....
    def facebook() {
        Token facebookAccessToken = (Token) session[oauthService.findSessionKeyForAccessToken('facebook')]
        if (facebookAccessToken) {
            String username = oauthCallBackService.facebook(facebookAccessToken)
            render view: '/index', model: [username: username]
        } else failure()
    }
....

基本上用户名向上移动直到它到达布局,这允许我在布局标题中使用用户名并在需要布局的所有页面上传播它。

答案 1 :(得分:0)

如果您使用Spring Security Core plugin,则可以在控制器中reauthenticate用户。

springSecurityService.reauthenticate user.username

答案 2 :(得分:0)

您可以使用Spring安全核心的 SecurityTagLib 帮助程序进行检查。

application.gsp 中,您可以:

 ...
<sec:ifLoggedIn>

 <!-- Display user field with sec:loggedInUserInfo tag -->
 Welcome Back <sec:loggedInUserInfo field="fullName"/>

 <!-- Check if user have all specified privileges -->
 <sec:ifAllGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">
  You've ROLE_ADMIN AND ROLE_SUPERVISOR privileges.
 </sec:ifAllGranted>

 <!-- Check if user have at least one specified privileges -->
 <sec:ifAnyGranted roles="ROLE_ADMIN,ROLE_SUPERVISOR">
  You've ROLE_ADMIN OR ROLE_SUPERVISOR privileges.
 </sec:ifAnyGranted>

</sec:ifLoggedIn>

<sec:ifNotLoggedIn>

 It's public content, anonymous user.

</sec:ifNotLoggedIn>
 ...

您还可以使用:<sec:ifNotGranted roles="ROLE_USER"></sec:ifNotGranted>