我正在寻找关于如何在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"标签",将渲染/不基于用户权限渲染?有什么合成糖能让它更干净吗?
如果需要,我可以提供更多细节或代码示例。
谢谢
如果是我,我会这样做:
-
与其使用全局变量,不如使用单例模式。这意味着你不必把对象放在全局命名空间中,而是从模块中获取一个共享实例。
-
您可以使用异常和异常处理来要求权限并重定向到错误页面。
例如,你的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>
<? } ?>
我喜欢把我的安全检查放在文件、函数或其他东西的顶部。