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

Dav*_*e L 3 coldfusion coldbox cfml

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

要检索有关当前登录用户的信息,您可以调用auth().getUser()。此方法retrieveUserById()在应用程序定义的用户服务类中调用。在我的例子中,retrieveUserById()进入数据库,检索用户数据,然后返回一个组装的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;
}
Run Code Online (Sandbox Code Playgroud)

此外,一旦存储缓存的会话数据,我就看不到任何方法来检索它。任何帮助或指向成功实施 Cbauth 示例的指针将不胜感激!

小智 5

您尝试引用的数据位于interceptData结构内。任何拦截器的方法签名如下:

function interceptorName( required struct interceptData, required buffer, event, rc, prc );
Run Code Online (Sandbox Code Playgroud)

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

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

function postAuthentication( interceptData ) {
    arguments.interceptData.sessionStorage.setVar(
        "user",
        arguments.interceptData.user
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!这非常有帮助。注意:ColdBox 文档指出参数按以下顺序排列:`function InterceptorName( event, InterceptData, buffer, rc, prc );` 参考:https://coldbox.ortusbooks.com/digging-deeper/interceptors/how-做他们的工作 (2认同)