【问题标题】:PHP Design Patterns - Handling user permissions, removing PHP if statementsPHP 设计模式 - 处理用户权限,删除 PHP if 语句
【发布时间】:2014-10-02 06:44:11
【问题描述】:

我正在寻找有关如何在用 PHP 编写的网站上实现用户权限的建议。目前,这是我的策略:

  • 具有 PagePermissions 类型数组的 User 类
  • 具有 ActionPermissions 类型成员的 Page Permissions 类和一个方法“checkAction”,如果允许该操作,则返回 true/false
  • 每个操作权限都被命名并具有允许、拒绝或未定义的值。

创建/修改用户时,会设置他们的权限。登录时,用户对象被加载到 $_SESSION。对于每个请求,将相应的 PagePermissions 对象加载到 GLOBAL 中,然后每个视图都有:

<?php
include 'header.php'
?>
<!-- Some HTML code for the view -->
<!-- ... -->

<?php if($GLOBAL['pagePermissions']->checkAction('Admin-Only-Action')) { ?>
<a href="#adminAction">Admin-Only-Action</a>
<? } ?>

<!-- Some HTML code for the view -->
<!-- ... -->

<?php
include 'footer.php'
?>

我在每个视图后面也有一个控制器,如果它被发布,则具有类似的逻辑来允许/拒绝该操作。

有没有更好的方法,可以让我从我的(主要是)HTML 视图中抽象出 spaghetii PHP 代码?我可以创建基于用户权限呈现/不呈现的 PHP“标签”吗?是否有一些合成糖可以使这个更干净?

如果需要,我可以提供更多详细信息或代码示例。

谢谢

【问题讨论】:

  • 您可以为此使用 FRONT 控制器模式。这个 FRONT 控制器将被每个控制器继承,您可以在 FRONT 控制器本身完成调度后检查每个操作的权限。
  • 根据我收到的继承项目,我要么大量使用包含,要么大量使用对象。对于包含,我会执行以下操作: include 'everyone_menu.inc';包括“admin_menu.inc”;包括“editor_menu.inc”;然后,我将包含包含在“if”中以控制包含的内容。使用对象,我制作了一个菜单对象。在里面我有每个菜单的方法和一个使用 if 语句来决定显示哪个菜单的 show_menu 方法。

标签: php html privileges


【解决方案1】:

如果是我,我会这样做:

  1. 不要使用全局变量,而是使用单例模式。这意味着您不必将对象放在全局命名空间中,而是从模块中获取共享实例。

  2. 您可以使用异常和异常处理来要求权限并重定向到错误页面。

例如,您的 API 可能看起来更像

<?php
include 'Security.php';

my $secman = new Security();
$secman->require_permission('basic-user');
$can_admin = $secman->check_permissions('admin');

include 'header.php';
?>
<!-- Some HTML code for the view -->
<!-- ... -->

<?php if($can_admin) { ?>
<a href="#adminAction">Admin-Only-Action</a>
<? } ?>

我喜欢将我的安全检查放在文件、函数或其他任何内容的顶部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多