我使用访问控制过滤器进行访问管理,但无法完成一件事 – 例如,我如何才能让项目经理更新项目并禁止其他人?我通过matchCallback尝试了它,但在这种情况下,所有项目经理都可以更新任何项目,因为返回了TRUE.
类似的更常用的规则 – 如何允许用户使用ACF更新/删除他是作者的帖子?
- 'access' => [
- 'class' => AccessControl::className(),'only' => ['index','view','create','update','delete'],'rules' => [
- [
- 'actions' => ['update'],'allow' => true,'roles' => ['@'],'matchCallback' => function ($rule,$action) {
- return Yii::$app->user->identity->getProjectParticipants()
- ->one()->isManager(Yii::$app->user->identity->id);
- }
- ],],
它可以实现如下:
- use Yii;
- use yii\web\Controller;
- use yii\filters\AccessControl;
- class MyController extends Controller
- {
- ...
- public function behaviors()
- {
- return [
- 'access' => [
- 'class' => AccessControl::className(),'only' => ['update','rules' => [
- [
- 'actions' => ['update',$action) {
- if (Yii::$app->user->can('admin') || $this->isUserAuthor()) {
- return true;
- }
- return false;
- }
- ],];
- }
- protected function findModel($id)
- {
- if (($model = MyModel::findOne($id)) !== null) {
- return $model;
- } else {
- throw new NotFoundHttpException('The requested page does not exist.');
- }
- }
- protected function isUserAuthor()
- {
- return $this->findModel(Yii::$app->request->get('id'))->author->id == Yii::$app->user->id;
- }
- ...
- }