如何在Sabre DAV的CardDAV PDO后端类中获取登录用户明文密码
关于Sabre DAV CardDAV后端获取登录用户明文密码的说明
- 你提到的
\baikal\vendor\sabre\dav\lib\CardDAV\Backend\PDO.php是CardDAV通讯录存储后端,本身不负责用户认证逻辑,也不存储任何密码相关数据,无法直接在该文件中获取用户密码。 - Sabre DAV及Baikal默认遵循安全存储规范,仅保存用户密码的哈希值,不会持久化存储明文密码,正常流程下无法从存储层拿到明文密码。
如果确实需要获取用户本次登录请求中提交的明文密码,可在认证环节提前拦截提取,操作方式如下:
- 找到Baikal初始化Sabre DAV Server实例的代码,通常位于
\baikal\Core\Frameworks\Baikal\Core\Server.php - 在注册认证插件的逻辑后,新增事件回调从请求头中提取明文密码,存入当前Server实例的临时属性,示例代码如下:
$authPlugin = new \Sabre\DAV\Auth\Plugin(new \Sabre\DAV\Auth\Backend\PDO($pdo), 'Baikal'); $server->addPlugin($authPlugin); // 新增回调提取明文密码,仅在当前请求内存中临时存储 $server->on('beforeMethod', function ($request, $response) use ($server) { $authHeader = $request->getHeader('Authorization'); if (str_starts_with(strtolower($authHeader), 'basic ')) { $decoded = base64_decode(substr($authHeader, 6)); list($username, $plainPwd) = explode(':', $decoded, 2); // 写入server实例自定义属性,后续逻辑可直接读取 $server->currentUserPlainPassword = $plainPwd; } }, 10);
- 后续在CardDAV后端的业务逻辑中,只要能获取到当前
Sabre\DAV\Server实例,即可通过$server->currentUserPlainPassword读取到本次登录的明文密码。
注意:获取、存储用户明文密码属于极高风险操作,会严重破坏账号安全性,若非绝对必要请勿实现该逻辑,提取的明文密码仅可在当前请求内存中临时使用,禁止写入任何持久化存储介质。
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

