限制用户访问MVC

时间:2016-02-01 03:06:59

标签: php

对于仅允许用户访问MVC应用程序中的某些控制器操作的最佳实践,这是一个理论问题。

我有两种类型的用户,"系统用户" &安培; "远程用户"。每个都可以访问自己的一组页面。

这是来自前一个开发人员的继承框架,并且会自动生成路由,因此没有设置定义。

我考虑过创建白名单类型的访问,而不是使用完整的ACL访问方法。我应该在路由器前还是按方法进行?

同样,我以前从来没有这样做,所以我想做的事情就是:

$system_users = [
    '/path/to/page',
    '/path/to/page2',
    '/path/to/page3',
    '/path/to/page4',
    //....etc
];

$remote_users = [
    '/remote/page',
    '/remote/page2',
    //....etc
];

然后在Router之前运行自定义检查(仅在用户登录时),例如:

$user_type = '';
if(Session::get('remote.id') !== FALSE){
    $user_type = 'remote';
} else if(Session::get('system.id') !== FALSE) {
    $user_type = 'system';
}

// now run list
if(!empty($user_type)) {
    if(!in_array(REQUESTED_ROUTE, ${$user_type.'_users'})){
        // Access Denied
        redirect('/NOT_ALLOWED');
    }
    // otherwise carry on with routing.

}

以上是伪代码。

实现这一目标的最佳方法是什么?在会话中运行它?预路由器?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您应该创建一个包含组和权限的数据库表(ACL组件/控制器)。 然后,您需要将一个(或没有)允许的页面分配到表中。

用户尝试转到其他页面后 - 您需要检查页面地址(或检查他尝试执行的Controller + Action)并提供信息或错误消息。

你应该有3个表:

  • 权限
  • 操作

在您需要创建下一列的操作中:

  • ID V.1
  • 控制器
  • 动作

V.2   - 页面

在权限中:

  • ID
  • GROUP_ID
  • Permisssion_id
  • 访问

群组表:

  • ID
  • 群组名称

当您添加一些新动作时,您需要将其添加到所有群组,并且不允许'权限(将访问权限设置为0)。当您删除某些操作时 - 您需要使用外键删除权限表中的所有操作。