Cakephp 3中的超级用户或管理员 - 带管理员的电子商务

时间:2016-09-29 01:07:16

标签: cakephp authorization e-commerce

我正在使用CakePHP 3创建一个电子商务网站

我需要创建一个允许管理员上传的管理页面 产品并可能查看一些KPI等。

Cake中是否有办法让用户(一般客户在网站上购物)和超级用户(或管理员)同时使用?我的Users表中有一个'is_admin'列,用于区分admin和user。我只需要在我的addProducts函数中使用这样的东西,或者有更好的方法吗?

public function addProducts(){
    $user = $this->Auth->user();
    if($user['is_admin']) {
        //allow access
    } else {
      //throw anauthorised exception
    }
}

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以通过管理员和前端用户的不同网址进行管理。这可以通过路线和APP控制器进行管理。 我用于其中一个应用程序的内容如下:

在routes.php文件中

Router::prefix('admin', function ($routes) {
    // All routes here will be prefixed with `/admin`
    // And have the prefix => admin route element added.
    $routes->fallbacks('DashedRoute');
    $routes->connect('/', array('controller' => 'Users', 'action' => 'login'));
    /* Here you can define all the routes for the admin */
});

Router::scope('/', function ($routes) {

    $routes->connect('/', array('controller' => 'Users', 'action' => 'login', 'home'));
    /* Here you can define all the routes for the frontend */
});

请注意管理员需要在所有/ src / Controller,/ src / Template中创建一个名为" Admin"在这些目录中,您可以使用我们在代码中使用的相同结构。

现在需要在/src/Controller/AppController.php中编写代码

public $prefix = '';
public function initialize()
{

    $this->prefix = (!empty($this->request->params['prefix'])?$this->request->params['prefix']:'');
    $this->set('prefix',$this->prefix);
    if( !empty($this->prefix) && $this->prefix==='admin' )
    {   

        $this->loadComponent('Auth', [

            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login',
                'prefix'=>'admin'
            ],
            'loginRedirect' => [
                'controller' => 'Users',
                'action' => 'index',
                'prefix'=>'admin'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login',
                'prefix'=>'admin'
            ],
            'authError' => 'Did you really think you are allowed to see that?',
            'authenticate' => [
                'Form' => [
                    'finder' => 'admin',
                    'fields' => ['username' => 'email', 'password' => 'password']
                ]
            ],
            'storage' => ['className' => 'Session', 'key' => 'Auth.Admin']
        ]);
    }

    else
    {

        $this->loadComponent('Auth', [

            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'loginRedirect' => [
                'controller' => 'Users',
                'action' => 'myaccount'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'authError' => 'Did you really think you are allowed to see that?',
            'authenticate' => [
                'Form' => [
                    'finder' => 'user',
                    'fields' => ['username' => 'email', 'password' => 'password']
                ]
            ],
            'storage' => ['className' => 'Session', 'key' => 'Auth.User']
        ]);
    }
}

在这里你可以看到我们使用不同的密钥存储Auth.User和Auth.Admin

对于查找程序,您需要在位于src \ Model \ Table \ UsersTable.php

的用户模型表中编写以下代码
public function findAdmin(\Cake\ORM\Query $query, array $options)
{
    $query
        ->select(array('Users.email', 'Users.password','Users.id','Users.role_id'))
        ->where(array('Users.role_id' => 1));

    return $query;
}
public function findUser(\Cake\ORM\Query $query, array $options)
{
    $query
        ->select(array('Users.email', 'Users.password','Users.id','Users.role_id'))
        ->where(array('Users.status' => 1,'Users.role_id' => 3));

    return $query;
}

注意,这里我保留了role_id" 1"对于管理员和" 3"对于前端用户。

通过这种方式,即使您可以在同一浏览器中为两个用户类型设置两个用户类型的登录名。

希望这可以帮助您相应地设置结构。