代码之家  ›  专栏  ›  技术社区  ›  Derek Gutierrez

如何通过三个级别的用户访问路由多级用户列表和创建操作。

  •  0
  • Derek Gutierrez  · 技术社区  · 7 年前

    以下是要求。我将有三个级别的权限访问受限制的仪表板,这些仪表板不允许公众访问(系统管理员、经理、员工)。

    简单地说,系统管理员本质上是超级管理员。他们能够索引、显示、创建、更新和删除所有公司和用户。

    经理由系统管理员创建并分配给公司,他们只能索引、显示、创建、更新和删除所属公司的员工。

    员工对其公司信息和文件具有只读访问权限。

    这是我目前为用户提供的路线。(使用Slim框架)

    受中间件保护的仅限系统管理员访问: 这些操作由系统管理员管理所有用户。

    /*** USERS ***/
    
    // View to List Users
    $this->get('/users', 'App\Controller\User\UserController:index')->setName('user.index');
    
    // View containing user registration form
    $this->get('/users/new', 'App\Controller\User\UserController:create')->setName('user.create');
    
    // Creates new user from registration form
    $this->post('/users' , 'App\Controller\User\UserController:store');
    
    // Show single user view
    $this->get('/users/{id}', 'App\Controller\User\UserController:show')->setName('user.show');
    
    // View containing edit user form
    $this->get('/users/{id}/edit', 'App\Controller\User\UserController:edit')->setName('user.edit');
    
    // Updates new user from edit user form
    $this->put('/users/{id}', 'App\Controller\User\UserController:update');
    
    // Deletes new user from edit user form
    $this->delete('/users/{id}', 'App\Controller\User\UserController:delete');
    

    系统管理(&A);受中间件保护的仅管理器访问: 这些互动供经理管理员工

    /*** COMPANIES Employees ***/
    
    // View to List Companies employees
    $this->get('/companies/{id}/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');
    
    // View containing new employee registration form
    $this->get('/companies/{id}/users/new', 'App\Controller\Company\CompanyUsersController:create')->setName('company.user.create');
    
    // Creates new employee from registration form
    $this->post('/companies/{id}/users' , 'App\Controller\Company\CompanyUsersController:store');
    
    // Show single user
    $this->get('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:show')->setName('company.user.show');
    
    // View containing edit company employee form
    $this->get('/companies/{id}/users/{id}/edit', 'App\Controller\Company\CompanyUsersController:edit')->setName('company.user.edit');
    
    // Updates user from edit user form
    $this->put('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:update');
    
    // Deletes new user from edit user form
    $this->delete('/companies/{id}/users/{id}', 'App\Controller\Company\CompanyUsersController:delete');
    

    您会注意到,对于系统管理员,不需要公司id。然而,对于商店经理来说,情况确实如此。因此,这些交互将有单独的查询。我的问题更多的是关于最佳实践。这个解决方案对我来说似乎有点多余,但它有效地分离了关注点,并简化了每个控制器上的方法以及访问控制所需的中间件。我是不是完全错了?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rob Allen    7 年前

    我将为所有角色提供相同的路由,因为URL代表查看该信息的规范方式。

    e、 g。

    $this->get('/companies/{id}/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');
    

    是给定公司用户列表的正确URL。

    我知道商店经理只能访问自己公司的用户,但这并不意味着URL必须不同。这意味着即使她可以访问 /companies/123/users ,她无法访问 /companies/456/users 。这应该在组中间件或每个控制器中完成。就个人而言,我怀疑我会使用这样的组中间件:

    $app->group(/companies/{id}, function () {
        $this->get('/users', 'App\Controller\Company\CompanyUsersController:index')->setName('company.user.index');
    })->add(CheckUserCompanyMiddlerware::class);
    

    如果商店经理去了“错误”的公司,则显示错误页面或重定向回正确的URL。