如何使用acegi将登录用户的ID传递给grails中我选择的控制器

时间:2010-01-13 14:53:21

标签: authentication grails spring-security

我使用ACEGI插件保护了我的Grails应用程序,并在我的控制器方法上使用注释来提示用户登录。

我的应用有一个静态HTML首页,上面有一个登录链接,重定向到login/auth页面。在成功登录后,我想为经过身份验证的用户加载我自己的自定义页面,名为person/mainpage

在我的LoginController中,有以下代码......

def index = {
    if (isLoggedIn()) {
        redirect uri: '/'
    }
    else {
        redirect action: auth, params: params
    }
}

/**
 * Show the login page.
 */
def auth = {

    nocache response

    if (isLoggedIn()) {
        redirect uri: '/'
        return
    }

    String view
    String postUrl
    def config = authenticateService.securityConfig.security
    if (config.useOpenId) {
        view = 'openIdAuth'
        postUrl = "${request.contextPath}/login/openIdAuthenticate"
    }
    else if (config.useFacebook) {
        view = 'facebookAuth'
        postUrl = "${request.contextPath}${config.facebook.filterProcessesUrl}"
    }
    else {
        view = 'auth'
        postUrl = "${request.contextPath}${config.filterProcessesUrl}"
    }

    render view: view, model: [postUrl: postUrl]
}

这会将成功登录重定向回应用程序的主页面(/),这不是我想要的。谷歌搜索了一会儿,我发现我可以像securityconfig.groovy那样为我的身份验证定义默认目标..

defaultTargetUrl = "/person/mainpage"

我的问题是如何识别我mainpage PersonController行动中的def index = { if (isLoggedIn()) { redirect controller: person, action: mainpage, params: params } else { redirect action: auth, params: params } } 行动时登录的用户?

首先,我在LoginController中更改了我的索引操作,以重定向到我的页面,就像这样...

params

但是登录人员的ID没有出现在person/mainpage中(我觉得我很高兴,因为仅仅通过将用户行ID定义为网址来提取页面似乎很疯狂参数)。

那么正确的方法是什么?基本上我希望我的{{1}}操作能够解析当前登录的用户。

1 个答案:

答案 0 :(得分:2)

您可以使用authenticateService访问登录用户。要获取用户/个人域实例,请调用authenticateService.userDomain()并获取Authentication(具有可能足够的getUsername()方法),调用authenticateService.principal()。如果您的defaultTargetUrl是“/ person / mainpage”,那么您的PersonController的“主页”操作将如下所示:

class PersonController {

   def authenticateService

   def mainpage = {
      def user = authenticateService.userDomain()
      if (user) {
         log.info "you're logged in as $user.username"
      }
      else {
         log.info "you're not logged in"
      }
      [user: user]
   }
}

然后你可以在mainpage.gsp中使用'user'来渲染数据。