当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

授权(Authorization)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:22

由  创建, 最后一次修改 2016-02-24 授权授权是指验证用户是否允许做某件事的过程。Yii提供两种授权方法: 存取控制过滤器(ACF)和基于角色的存取控制(RBAC)。存取控制过滤器存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法, 非常适用于仅需要简单的存取控制的应用。正如其名称所指,ACF 是一个种行动(action)过滤器?filter,可在控制器或者模块中使用。当一个用户请求一个 action 时, ACF会检查 yii\filters\AccessControl::rules 列表,判断该用户是否允许执 行所请求的action。(译者注:?action?在本文中视情况翻译为行动、操作、方法等)下述代码展示如何在?site?控制器中使用 ACF:use yii\web\Controller;use yii\filters\AccessControl;class SiteController extends Controller{ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['login', 'logout', 'signup'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'signup'], 'roles' => ['?'], ], [ 'allow' => true, 'actions' => ['logout'], 'roles' => ['@'], ], ], ], ]; } // ...}上面的代码中 ACF 以行为 (behavior) 的形式附加到?site?控制器。 这就是很典型的使用行动过滤器的方法。?only?选项指明 ACF 应当只 对?login,?logout?和?signup?方法起作用。所有其它的?site?控制器中的方法不受存取控制的限制。?rules?选项列出了 yii\filters\AccessRule,解读如下:允许所有访客(还未经认证的用户)执行?login?和?signup?操作。?roles?选项包含的问号???是一个特殊的标识,代表”访客用户”。允许已认证用户执行?logout?操作。@是另一个特殊标识, 代表”已认证用户”。ACF 自顶向下逐一检查存取规则,直到找到一个与当前 欲执行的操作相符的规则。 然后该匹配规则中的?allow?选项的值用于判定该用户是否获得授权。如果没有找到匹配的规则, 意味着该用户没有获得授权。(译者注:?only?中没有列出的操作,将无条件获得授权)当 ACF 判定一个用户没有获得执行当前操作的授权时,它的默认处理是:如果该用户是访客,将调用 yii\web\User::loginRequired() 将用户的浏览器重定向到登录页面。如果该用户是已认证用户,将抛出一个 yii\web\ForbiddenHttpException 异常。你可以通过配置 yii\filters\AccessControl::denyCallback 属性定制该行为:[ 'class' => AccessControl::className(), ... 'denyCallback' => function ($rule, $action) { throw new \Exception('You are not allowed to access this page'); }]yii\filters\AccessRule 支持很多的选项。下列是所支持选项的总览。 你可以派生 yii\filters\AccessRule 来创建自定义的存取规则类。yii\filters\AccessRule::allow: 指定该规则是 "允许" 还是 "拒绝" 。(译者注:true是允许,false是拒绝)yii\filters\AccessRule::actions:指定该规则用于匹配哪些操作。 它的值应该是操作方法的ID数组。匹配比较是大小写敏感的。如果该选项为空,或者不使用该选项, 意味着当前规则适用于所有的操作。yii\filters\AccessRule::controllers:指定该规则用于匹配哪些控制器。 它的值应为控制器ID数组。匹配比较是大小写敏感的。如果该选项为空,或者不使用该选项, 则意味着当前规则适用于所有的操作。(译者注:这个选项一般是在控制器的自定义父类中使用才有意义)yii\filters\AccessRule::roles:指定该规则用于匹配哪些用户角色。 系统自带两个特殊的角色,通过 yii\web\User::isGuest 来判断:?: 用于匹配访客用户 (未经认证)@: 用于匹配已认证用户使用其他角色名时,将触发调用 yii\web\User::can(),这时要求 RBAC 的支持 (在下一节中阐述)。 如果该选项为空或者不使用该选项,意味着该规则适用于所有角色。yii\filters\AccessRule::ips:指定该规则用于匹配哪些 yii\web\Request::userIP 。 IP 地址可在其末尾包含通配符?*?以匹配一批前缀相同的IP地址。 例如,192.168.*?匹配所有?192.168.?段的IP地址。 如果该选项为空或者不使用该选项,意味着该规则适用于所有角色。yii\filters\AccessRule::verbs:指定该规则用于匹配哪种请求方法(例如GET,POST)。 这里的匹配大小写不敏感。yii\filters\AccessRule::matchCallback:指定一个PHP回调函数用于 判定该规则是否满足条件。(译者注:此处的回调函数是匿名函数)yii\filters\AccessRule::denyCallback: 指定一个PHP回调函数, 当这个规则不满足条件时该函数会被调用。(译者注:此处的回调函数是匿名函数)以下例子展示了如何使用?matchCallback?选项, 可使你设计任意的访问权限检查逻辑:use yii\filters\AccessControl;class SiteController extends Controller{ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['special-callback'], 'rules' => [ [ 'actions' => ['special-callback'], 'allow' => true, 'matchCallback' => function ($rule, $action) { return date('d-m') === '31-10'; } ], ], ], ]; } // 匹配的回调函数被调用了!这个页面只有每年的10月31号能访问(译者注:原文在这里说该方法是回调函数不确切,读者不要和 `matchCallback` 的值即匿名的回调函数混淆理解)。 public function actionSpecialCallback(

[1] [2] [3]  下一页


授权(Authorization)