gpt4 book ai didi

session - 如何在 Grails 应用程序中存储/加载用户名?

转载 作者:行者123 更新时间:2023-12-02 15:28:13 25 4
gpt4 key购买 nike

我有一个 Grails (2.3.6) 应用程序,需要用户登录才能访问该应用程序。一旦他们成功登录,他们就会被重定向到一个登录页面,该页面在右上角显示他们的用户名。我用以下 3 段代码很好地工作(或者我认为):

// myapp/grails-app/realms/myapp/MyAppRealm.groovy:
class MyAppRealm {
def onSuccessfulLogin(Principal principal) {
// Lots of code

// If I logged in successfully with a username of "user1", then principal.name will be "user1" here.
UserHolder.name = principal.name

// Lots more code
}
}

在上面的代码中 onSuccessfulLogin()如果身份验证层确定他们成功登录,则执行方法。 principal.name value 是他们登录时使用的经过身份验证的用户名。如您所见,我将此值存储在 UserHolder POGO 看起来像:
class UserHolder {
static String name = null

static String getName() {
name
}

static void setName(String n) {
name = n
}
}

然后,在我的 GSP 文件中:
// myapp/grails-app/views/page.gsp
You are logged in as ${UserHolder?.name}.

刚给我报告一个测试员登录成功,几分钟后,按F5刷新他们的屏幕,却发现他们的用户名属于另一个测试员!看了代码,原因很明显: UserHolder.name是一个静态变量;在任何给定时间点,只有 1 个实例会存在于服务器上。所以如果 user1登录,他们会看到 user1作为他们在 UI 中的用户名。但是如果 user2然后登录, User.name现在等于 user2 , 如果 user1刷新他们的屏幕,他们会看到 user2作为他们的用户名。

所以我的下一个想法是尝试存储 principal.name在像 session.name = principal.name 这样的 session 变量中:
// myapp/grails-app/realms/myapp/MyAppRealm.groovy:
class MyAppRealm {
def onSuccessfulLogin(Principal principal) {
// Lots of code

// If I logged in successfully with a username of "user1", then principal.name will be "user1" here.
session.name = principal.name

// Lots more code
}
}

...然后在 GSP 中引用它,如 You are logged in as ${session.name}. .问题是我无法访问 session从内部 MyAppRealm.groovy ,而且它不容易注入(inject)(除非有人能想到如何注入(inject))。所以我问:我怎样才能“记录” principal.nameMyAppRealm ,然后从 GSP 中指定正确的用户名?

最佳答案

我在我的 Groovy 和 Grails 应用程序中有类似的要求。这不是您解决方案的直接答案,但您可以尝试类似的方法。这就是我所做的:

class UserController {

def register() {
if(request.method == 'POST') {
def u = new User()
u.properties[
'login',
'password',
'firstName',
'lastName',
] = params

if(u.save()) {
session.user = u
session.setMaxInactiveInterval(-1)
redirect(controller: "myController", action: "welcome")
}
}

在我看来,我使用它如下:
Welcome ${session?.user?.firstName}

我的用户域类如下:
class User {
String login
String password
String firstName
String lastName
}

希望能帮助到你 :)

关于session - 如何在 Grails 应用程序中存储/加载用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com