策略

位置

策略放置在 {module}/src/models/polices 文件夹中

策略映射放在 {module}/src/ServiceProvider.php 文件中, 如下定义

protected $policies = [
    PamRole::class    => RolePolicy::class,
    PamAccount::class => AccountPolicy::class,
];

策略权限

对特定用户,你可能希望通过指定的策略授权所有动作。 要达到这个目的,可以在策略中定义一个  before  方法。before  方法会在策略中其它所有方法之前执行,这样提供了一种方式来授权动作而不是指定的策略方法来执行判断。

use PolicyTrait;

/**
 * @var array 权限映射
 */
protected static $permissionMap = [
    // for controller
    'establish'  => 'backend:ad.place.establish',
    'global'     => 'backend:ad.place.manage',
    // create 操作 必须要有对应的  'backend:ad.place.establish' 权限
    'create'     => 'backend:ad.place.establish',
    'edit'       => 'backend:ad.place.establish',
    'delete'     => 'backend:ad.place.delete',
    'permission' => 'backend:ad.place.permission',
];

如果你想拒绝用户所有的授权,你应该在  before  方法中返回  false。如果返回的是  null,则通过其它的策略方法来决定授权与否。

/**
 * 策略映射
 */
trait PolicyTrait
{

    /**
     * @param PamAccount $pam     账号
     * @param string     $ability 能力
     * @return bool|null
     */
    public function before(PamAccount $pam, $ability)
    {
        $permission = self::$permissionMap[$ability] ?? '';
        return $permission ? $pam->capable($permission) : null;
    }

    /**
     * 策略映射
     * @return mixed#
     */
    public static function getPermissionMap()
    {
        return self::$permissionMap;
    }

}

控制器

/**
 * 广告位管理
 */
class PlaceController extends InitController
{
    public function __construct()
    {
        parent::__construct();
        self::$permission = AdPlacePolicy::getPermissionMap();
    }
}

这里定义的 permission 权限会在 permission 中有拦截, 让用户无法通过控制器来进入这个操作, 看到相关的数据.