PHP设计模式-处理用户权限,删除PHP if语句


PHP Design Patterns - Handling user permissions, removing PHP if statements

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

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

创建/修改用户时,设置用户的权限。登录时,User对象被加载到$_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视图中抽象出面条式PHP代码?我可以创建PHP"标签",将渲染/不基于用户权限渲染?有什么合成糖能让它更干净吗?

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

谢谢

如果是我,我会这样做:

  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>
<? } ?>

我喜欢把我的安全检查放在文件、函数或其他东西的顶部。

相关文章: