如何在 Coldbox 应用程序中使用 Cbauth 存储、检索和更新会话用户数据?

How to I Store, Retrieve, and Update Session User Data Using Cbauth in a Coldbox App?

Cbauth 是 Coldbox 应用程序中常用的 Forgebox 模块,用于处理用户身份验证。

要检索当前登录用户的信息,您可以调用auth().getUser()。此方法在应用程序定义的用户服务 class 中调用 retrieveUserById()。在我的例子中,retrieveUserById() 进入数据库,检索用户数据,然后 returns 一个组装的 User 实体对象。

在我的项目中,我想在每个页面上显示当前登录用户的名字和头像。我想避免在每次页面请求时返回数据库,因为缓存至少一些用户数据(或者甚至可能是整个 User 实体)会更有效率。

在 Cbauth 中有没有一种方法可以在用户的​​会话范围内存储自定义数据,请求它,然后更新它(例如,如果用户在登录时更新他们的名字)

这是我到目前为止尝试过的方法:

根据文档,Cbauth 有一个名为 postAuthentication 的拦截器,它确实将 sessionStorage 作为参数传递。我相信我可以利用它来为当前用户存储额外的数据。但是,当我尝试在拦截器中引用 user 时,我收到一条 Element USER is undefined in ARGUMENTS 错误消息。

// After a user authenticates, store the user entity in the session (does not work)
function postAuthentication( user, sessionStorage, requestStorage ) {
    arguments.sessionStorage.user = arguments.user;
}

此外,我看不到任何方法可以在存储会话数据后检索它。非常感谢任何帮助或指向已成功实施 Cbauth 的示例的指针!

您尝试引用的数据在 interceptData 结构中。任意拦截器的方法签名如下:

function interceptorName( required struct interceptData, required buffer, event, rc, prc );

因此您可以将 user 作为 arguments.interceptData.user 访问并使用 arguments.sessionStorage.setVar( "user", arguments.interceptData.user ); 存储它(sessionStorage 不是 session 范围。它是提供的外观通过 cbstorages.

这是从上面修改而来的完整拦截器签名:

function postAuthentication( interceptData ) {
    arguments.interceptData.sessionStorage.setVar(
        "user",
        arguments.interceptData.user
    );
}