Auth – 简便的内联授权
我编写了一个包装类来使内联授权更轻松。很多时候,您希望在操作或视图中检查某些角色,并根据结果显示特定内容或执行特定代码。例如,我们只希望为管理员在主屏幕上显示“管理员信息”框。其他所有用户都应该看不到此框。
Auth.User.Role (with Role being an array of role ids)
3 我们需要手动检查会话是否与我们想要授予访问权限的角色匹配。如果允许多个角色(例如,如果管理员和版主都允许查看此框),则这可能会变得非常麻烦。
准备工作
首先,我们需要将此类放在我们的 /Config/bootstrap.php 中使其可使用。
// these IDs match the role_ids in the DB
define('ROLE_SUPERADMIN', '1');
define('ROLE_ADMIN', '2');
define('ROLE_MOD', '3');
define('ROLE_USER', '4');
// enable the Auth class
App::uses('Auth', 'Tools.Lib');
我喜欢使用常量,因为它们比 Configure::read(‘admin’) 等更短。但 Configure 也同样有效。
然后,我们需要确定是使用单一角色(Cake 默认值)还是多角色授权。我通常总是使用多角色。因此,Auth 类的默认情况正是这样。然后会话包含:B0x1A1 如果您使用单一角色,则您的会话数组应如下所示
Auth.User.role_id (with role_id being the single role we want to check against)
在这种情况下,您应该在引导程序中手动设置以下常量
define('USER_ROLE_KEY', 'role_id');
“以前”用法
为了比较,我将首先概述手动和“过时”的授权方式。
// we want to make sure that piece is only visible to admins and moderators
if ($this->Session->read('Auth.User.role_id') == ROLE_ADMIN || $this->Session->read('Auth.User.role_id') == ROLE_MOD) {}
// or with multi-role
if (in_array(ROLE_ADMIN, (array)$this->Session->read('Auth.User.Role')) || in_array(ROLE_MOD, (array)$this->Session->read('Auth.User.Role'))) {}
写起来很多…
注意:这也仅适用于控制器/组件和视图/助手范围。您需要使用静态 CakeSession::read() 来使其在模型/行为等中工作。
用法
现在是令人兴奋的部分。包装类可以在 [Tools 插件](https://github.com/dereuromark/tools/blob/2.0/Lib/Auth.php) 中找到。
// Same thing as above
if (Auth::hasRoles(array(ROLE_ADMIN, ROLE_MOD)) {}
现在写起来和读起来是不是更好了?
默认情况下,如果匹配到其中一个角色,它会立即返回 true。如果您想将它们与 AND 而不是 OR 联系起来,您需要将第二个参数设置为 false
// This only passed if the user has both roles!
if (Auth::hasRoles(array(ROLE_ADMIN, ROLE_MOD), false) {}
如果我们只想针对单个角色进行检查,我们也可以使用简写形式
if (Auth::hasRole(ROLE_MOD) {}
高级用法
您也可以传入您想要检查的角色。如果您想检查其他人的角色(而不是您的会话角色),这将很有用。这在 CLI(命令行/shell)环境和管理后台中也会非常有用。
if (Auth::hasRole(ROLE_MOD, $rolesOfThisUser) {}
以及
if (Auth::hasRoles(array(ROLE_MOD, ROLE_USER), true, $rolesOfThisUser) {}
还有更多
还有一些方便的方法可用。您只需编写 $uid = $this->Session->read(‘Auth.User.id’),而不是
$uid = Auth::id(); // anywhere in your application
可以像这样获取角色
$myRoles = Auth::roles(); // string in single-role and array in multi-role context
最后但并非最不重要的是用户数据
$user = Auth::user(); // complete user array
$username = Auth::user('username'); // string: current username
...
详情
[在此阅读完整文章][文章]。 [文章]: http://www.dereuromark.de/2012/04/07/auth-inline-authorization-the-easy-way/