我使用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}}操作能够解析当前登录的用户。
答案 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'来渲染数据。