CakePHP 3 具有多个身份验证会话的“登录身份”

2024-01-02

使用前缀,我可以为管理员和用户提供单独的会话和登录。例如 AppController.php 有:

    if ($this->request->prefix == 'admin') {

        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'userModel' => 'Admins',
                    'fields' => ['username' => 'email', 'password' => 'password']
                ],
            ],
            'loginAction' => [
                'controller' => 'Admins',
                'action' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'Admins',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Admins',
                'action' => 'login',
            ],
            'storage' => [
                'className' => 'Session',
                'key' => 'Auth.Admin',              
            ],
        ]);

    } else {

        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'userModel' => 'Users',
                    'fields' => ['username' => 'email', 'password' => 'password']
                ],
            ],
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'pages',
                'action' => 'home'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login',
            ],
            'storage' => [
                'className' => 'Session',
                'key' => 'Auth.User',               
            ],
        ]);

    }

这工作正常,因为访问 example.com/admin 的用户被重定向到管理员登录区域,访问 example.com 的用户被重定向到用户登录区域,并且用户可以同时登录其中一个、另一个或两者互不干扰。

当我希望管理员能够“以”另一个用户身份登录时,问题就出现了。在 CakePHP2 中我能够做到这一点:

    AuthComponent::$sessionKey = 'Auth.User'; // solution from http://stackoverflow.com/questions/10538159/cakephp-auth-component-with-two-models-session
    $this->Auth->loginAction = array('admin'=>false,'controller'=>'accounts','action'=>'login');
    $this->Auth->loginRedirect = array('admin'=>false,'controller'=>'pages','action'=>'home');
    $this->Auth->logoutRedirect = array('admin'=>false,'controller'=>'accounts','action'=>'login');
    $this->Auth->authenticate = array(
        'Custom' => array(
            'userModel' => 'Account',
            'fields' => array('username' => 'number'),
        )
    );
    if (!$this->Auth->login($account['Account'])) {
        throw new NotFoundException(__('Could not login to account'));
    }

    return $this->redirect(array('admin' => false, 'controller' => 'getting_started', 'action' => 'index'));

一切都很好。但在 CakePHP3 中,AuthComponent::$sessionKey 属性似乎不可访问,相反,我认为我应该使用 $this->Auth->config。但是当我使用这段代码时:

public function loginas($id = null)
{

    $user = $this->Users->get($id, [
        'contain' => []
    ]);

    $this->Auth->config([
        'authenticate' => [
            'Form' => [
                'userModel' => 'Users',
                'fields' => ['username' => 'email', 'password' => 'password']
            ],
        ],
        'loginAction' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'loginRedirect' => [
            'controller' => 'pages',
            'action' => 'home'
        ],
        'logoutRedirect' => [
            'controller' => 'Users',
            'action' => 'login',
        ],
        'storage' => [
            'className' => 'Session',
            'key' => 'Auth.User',               
        ],
    ]);

    $this->Auth->setUser($user->toArray());
    return $this->redirect([
        'prefix' => false,
        'controller' => 'pages',
        'action' => 'home',
    ]);     
}

我可以成功“登录为”,但是它还会使用普通用户详细信息覆盖现有管理会话的用户信息。

如何让 CakePHP 3 完全保留 Auth.Admin 会话,并针对 Auth.User 会话密钥(恰好在新选项卡中打开)设置新的 Auth 会话?


好吧,我想我已经弄清楚了,我需要使用 $this->Auth->__set('sessionKey', 'Auth.User');在调用 $this->Auth->config() 之前。

public function loginas($id = null)
{

    $user = $this->Users->get($id, [
        'contain' => []
    ]);

    $this->Auth->__set('sessionKey', 'Auth.User');

    $this->Auth->config([
        'authenticate' => [
            'Form' => [
                'userModel' => 'Users',
                'fields' => ['username' => 'email', 'password' => 'password']
            ],
        ],
        'loginAction' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'loginRedirect' => [
            'controller' => 'Pages',
            'action' => 'home'
        ],
        'logoutRedirect' => [
            'controller' => 'Users',
            'action' => 'login',
        ],
        'storage' => [
            'className' => 'Session',
            'key' => 'Auth.User',               
        ],
    ]);

    $this->Auth->setUser($user->toArray());
    return $this->redirect([
        'prefix' => false,
        'controller' => 'Pages',
        'action' => 'home',
    ]);     
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CakePHP 3 具有多个身份验证会话的“登录身份” 的相关文章

  • Polymer 1.0:用户身份验证 UX(建议、教程和示例)?

    是否有推荐的 聚合物方式 来进行用户身份验证 这个问题包括技术部分和用户体验 用于进行用户身份验证的用户体验的全面示例 和 或教程 将非常棒 注意 Polymer 入门套件不包含任何身份验证 UX 示例 在这个问题中 用户体验 的意思是 完
  • 在本地安全存储用于 Web 服务的密码

    我有一个应用程序 通过发送用户名和密码来对第三方 Web 服务进行身份验证 目前 我每次启动应用程序时都会在 winform 上输入密码 但我需要它自动登录 我想比更安全地存储用户名 密码 Dim username as String us
  • 在cakephp 3中动态更改数据库连接

    我正在尝试更改中使用的数据库连接蛋糕php 3在飞行中 我找到的这个问题的每个答案都指的是蛋糕PHP 2 These https stackoverflow com questions 27655613 multiple databases
  • 根据另一个输入的值更改输入值

    我想要一个包含几个输入的表单 例如 名称和网址 当用户输入他们的名字时 我希望 url 输入自动将他们的名字作为默认值 并在单词之间使用下划线 因此 如果他们输入自己的名字 pedro kinkybottom 则会自动将 url 输入中的默
  • 在 React Native 应用程序中哪里可以获取 EXPO DEBUG 值?

    当我尝试登录 expo 时出现此错误 exp Set EXPO DEBUG true in your env to view the stack trace 你知道我到底要在哪里设置值吗EXPO DEBUG EXPO DEBUG是一个环境变
  • CakePHP 身份验证插件身份关联

    我正在使用 CakePHP 3 8 并迁移到身份验证插件 https book cakephp org authentication 1 1 en index html https book cakephp org authenticati
  • cakephp 无法在 Ubuntu 上进行 url 重写

    全部 这次我尝试 cakephp 但我得到了 您的服务器上的 URL 重写未正确配置 1 帮我配置它 2 我不 不能使用 URL 重写 我可以知道这是 apache 和 htaccess 问题 例如 etc apache2 sites av
  • CakePHP 与 Lucene

    我正在尝试使用 cakephp 实现 Lucene 并遵循本指南http jamienay com 2010 01 zend search lucene datasource for cakephp http jamienay com 20
  • 在 GraphQL 服务器中实现访问控制的好模式是什么?

    背景 我有一组模型 包括用户和各种其他模型 其中一些模型包含对用户的引用 我公开这些模型 以便通过 GraphQL API 生成的查询Graffiti https github com RisingStack graffiti 由 Mong
  • 使用自定义 AuthenticationScheme 的 Blazor 服务器 cookie 身份验证

    我正在尝试在我的 Blazor 服务器应用程序中构建自定义 cookie 身份验证 只要我像这样使用 DefaultAuthenticateScheme 它就可以工作 builder Services AddAuthentication o
  • Coldfusion 跨站点身份验证

    好的 在我正在开发的 Coldfusion 网站上 我刚刚安装了一个名为 Galleon 的第三方 开源 CF 论坛 我不久前问过类似的问题 但现在我们已经取得了一些进展 目前的问题是 它不会识别父站点本身存在的任何变量 会话等 论坛本身存
  • 使用 OWIN Ws-Federation 包针对 ADFS 3.0 进行身份验证

    我有一个MVC内网站点 需要使用AD帐户进行身份验证 我设置了 ADFS 3 0 Windows Server 2012 R2 并遵循this http www cloudidentity com blog 2014 02 12 use t
  • Angular 2 验证状态

    我使用 Angular 2 实现了一个登录页面 登录后 我从服务器获取 jsonwebtoken userId userRole userName 我将此信息存储在本地存储中 以便我可以随时访问它并在用户刷新页面时保持登录状态 AuthSe
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 以编程方式解锁 Windows

    在我当前的 C 代码中 我能够以编程方式锁定 Windows 用户会话 与 Windows L 相同 由于应用程序仍将运行 是否有任何方法可以从该 C 程序解锁会话 用户凭据是已知的 该应用程序在 Windows 7 上运行 您将需要一个自
  • 如何在 CakePHP 3 中将 COUNT(*) 与 find('list') 一起使用?

    在 CakePHP 3 中 我有一个名为 文章 的模型和一个名为 主题 的字段 在尝试检索 100 个最常用文章主题的列表时遇到了障碍 选择以下代码生成的 SQLall可能的字段和not COUNT articles gt find lis
  • 从 .NET 应用程序登录 Windows

    我认为它应该是一个Windows服务 当给定某些条件时 它应该执行登录到机器的操作 机器将在 登录屏幕 中检查网络服务 以了解登录时应使用的用户名和密码 这可以吗 我不想要 自动登录 Windows 功能 Thanks AFAIK 无法完成
  • 设计没有路由与指定删除的链接中的 [GET]“/users/sign_out”匹配

    因此 我四处寻找解决此问题的方法 大多数人似乎都说了同样的话 但对解决我的问题没有多大作用 我已在链接中指定了删除方法 但路由错误表明这是一个 GET 请求 知道为什么下面的链接最终会覆盖 忽略方法声明吗 Routes devise for
  • 如何使用 phantomjs 使用文件中的持久 cookie

    我需要一些身份验证才能访问特定的网址 在浏览器中我只需要登录一次 至于其他可以使用cookie中的会话id的相关url不需要转到登录页面 同样 我可以使用 cookie 文件中生成的 cookie cookies file cookies
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了

随机推荐