如何在我的WebMVC应用程序中实现访问控制列表?

第一个问题

拜托,你能解释一下如何用MVC实现最简单的ACL吗?

这里是在控制器中使用ACL的第一种方法。

<?phpclass MyController extends Controller {

  public function myMethod() {        
    //It is just abstract code
    $acl = new Acl();
    $acl->setController('MyController');
    $acl->setMethod('myMethod');
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...    
  }}?>

这是一种非常糟糕的方法,它的减号是我们必须在每个控制器的方法中添加ACL段代码,但是我们不需要任何额外的依赖项!

下一步是让所有控制器的方法private并将ACL代码添加到控制器的__call方法。

<?phpclass MyController extends Controller {

  private function myMethod() {
    ...
  }

  public function __call($name, $params) {
    //It is just abstract code
    $acl = new Acl();
    $acl->setController(__CLASS__);
    $acl->setMethod($name);
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...   
  }}?>

它比以前的代码要好,但是主要的缺点是.

  • 所有控制器的方法都应该是私有的
  • 我们必须在每个控制器的_Call方法中添加ACL代码。

下一种方法是将ACL代码放入父Controller中,但我们仍然需要将所有子控制器的方法保持为私有。

解决办法是什么?最佳做法是什么?我应该在哪里调用ACL函数来决定是否执行允许或不允许的方法。

第二个问题

第二个问题是如何使用ACL获取角色。让我们想象一下,我们有客人、用户和用户的朋友。用户对查看他的个人资料有限制,只有朋友才能查看它。所有客人都无法查看此用户的配置文件。所以,这就是逻辑.。

  • 我们必须确保被调用的方法是配置文件。
  • 我们必须检测到这个配置文件的所有者
  • 我们必须检测查看者是否拥有此配置文件。
  • 我们必须阅读有关此配置文件的限制规则。
  • 我们必须决定执行还是不执行配置文件方法。

主要问题是如何检测配置文件的所有者。我们可以检测到谁是配置文件的所有者,只执行模型的方法$model->getOwner(),但是ACL没有访问模型的权限。我们如何实现这一点?

我希望我的想法是清楚的。对不起我的英语。

谢谢。

如何在我的WebMVC应用程序中实现访问控制列表?

阿晨1998
浏览 373回答 3
3回答

守着星空守着你

一种可能是将所有控制器封装在扩展Controller的另一个类中,并让它在检查授权后将所有函数调用委托给包装好的实例。您还可以在Dispatcher中(如果您的应用程序确实有一个)并根据URL来查找权限,而不是控制方法。编辑:您是否需要访问数据库、LDAP服务器等都是正交的问题。我的观点是,您可以基于URL而不是控制器方法来实现授权。这些功能更健壮,因为您通常不会更改URL(URL区域类似于公共接口),但您最好还是更改控制器的实现。通常,您有一个或多个配置文件,其中将特定的URL模式映射到特定的身份验证方法和授权指令。调度员在向控制器发送请求之前,确定用户是否被授权,如果用户没有授权,则中止调度。
打开App,查看更多内容
随时随地看视频慕课网APP