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)