kosmosafive/kosmos.access

Kosmos: 访问权限

安装: 4

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

语言:JavaScript

类型:bitrix-d7-module

1.1.1 2024-10-02 07:27 UTC

This package is auto-updated.

Last update: 2024-10-02 07:27:50 UTC


README

介绍

访问权限的概念在文档中描述。该模块提供了一套工具,用于简化配置界面的创建,并扩展了内置功能。

安装

  • 安装模块
  • (可选) 如果使用来自模块解决方案的设置页面,则需要确保已安装“搜索”和“社交网络”内核模块。

通过composer安装

在项目的composer.json文件中(例如,对于local目录)添加以下内容:

{
  "require": {
    "wikimedia/composer-merge-plugin": "dev-master"
  },
  "config": {
    "allow-plugins": {
      "wikimedia/composer-merge-plugin": true
    }
  },
  "extra": {
    "merge-plugin": {
      "require": [
        "../bitrix/composer-bx.json",
        "modules/*/composer.json"
      ],
      "recurse": true,
      "replace": true,
      "ignore-duplicates": false,
      "merge-dev": true,
      "merge-extra": false,
      "merge-extra-deep": false,
      "merge-scripts": false
    },
    "installer-paths": {
      "modules/{$name}/": [
        "type:bitrix-d7-module"
      ]
    }
  }
}

使用

在模块解决方案级别,需要创建一组描述访问权限的类。

在示例中,模块解决方案与其核心实体相呼应。示例中提供的继承不是强制的。

模型

每个模块都应该在其自己的表中存储角色和访问权限。

local/modules/kosmos.example/lib/Infrastructure/Model/ExamplePermissionTable.php

<?php

namespace Kosmos\Example\Infrastructure\Model;

use Bitrix\Main\Access\Permission\AccessPermissionTable;

class ExamplePermissionTable extends AccessPermissionTable
{
    public static function getTableName(): string
    {
        return 'kosmos_example_permission';
    }
}

local/modules/kosmos.example/lib/Infrastructure/Model/ExampleRoleTable.php

<?php

namespace Kosmos\Example\Infrastructure\Model;

use Bitrix\Main\Access\Role\AccessRoleTable;

class ExampleRoleTable extends AccessRoleTable
{
    public static function getTableName(): string
    {
        return 'kosmos_example_role';
    }
}

local/modules/kosmos.example/lib/Infrastructure/Model/ExampleRoleRelationTable.php

<?php

namespace Kosmos\Example\Infrastructure\Model;

use Bitrix\Main\Access\Role\AccessRoleRelationTable;

class ExampleRoleRelationTable extends AccessRoleRelationTable
{
    public static function getTableName(): string
    {
        return 'kosmos_example_role_relation';
    }
}

控制器

预计将存在至少一个控制器,即模块控制器。在示例中,模块控制器负责处理该模块的核心实体。

local/modules/kosmos.example/lib/Domain/Access/ExampleAccessController.php

<?php

namespace Kosmos\Example\Domain\Access;

use Bitrix\Main\Access\User\AccessibleUser;
use Bitrix\Main\Access\AccessibleItem;
use Kosmos\Example\Domain\Entity\Example;
use Kosmos\Example\Domain\Entity\UserModel;
use Kosmos\Access\AccessController;

class ExampleAccessController extends AccessController
{
    protected function loadItem(int $itemId = null): ?AccessibleItem
    {
        return ($itemId) ? Example::createFromId($itemId) : null;
    }

    protected function loadUser(int $userId): AccessibleUser
    {
        return UserModel::createFromId($userId);
    }
}

动作字典

动作字典中列出了所有可能的行为。

local/modules/kosmos.example/lib/Domain/Access/ActionDictionary.php

<?php

namespace Kosmos\Example\Domain\Access;

use Kosmos\Access\ActionDictionary as Base;

class ActionDictionary extends Base
{
    public const
        ACTION_CREATE = 'create',
        ACTION_EDIT = 'edit'
    ;
}

访问权限字典

local/modules/kosmos.example/lib/Domain/Access/Permission/PermissionDictionary.php

<?php

namespace Kosmos\Example\Domain\Access\Permission;

use Kosmos\Access\Permission\PermissionDictionary as Base;

class PermissionDictionary extends Base
{
    public const
        EXAMPLE_CREATE = 'example_create',
        EXAMPLE_EDIT_OWN = 'example_edit_own',
        EXAMPLE_EDIT_ALL = 'example_edit_all'
    ;
}

角色字典

local/modules/kosmos.example/lib/Domain/Access/Role/RoleDictionary.php

<?php

namespace Kosmos\Example\Domain\Access\Role;

use Bitrix\Main\Access\Role\RoleDictionary as Base;

class RoleDictionary extends Base
{
	public const
		EXAMPLE_ROLE_ADMIN = 'EXAMPLE_ROLE_ADMIN'
    ;
}

访问权限工具

local/modules/kosmos.example/lib/Domain/Access/Role/RoleUtil.php

<?php

namespace Kosmos\Example\Domain\Access\Role;

use Kosmos\Core\ORM\Model\UserGroupTable;
use Kosmos\Example\Infrastructure\Model;
use Kosmos\Access\Role\RoleUtil as Base;

class RoleUtil extends Base
{
    /**
     * @return string
     */
	protected static function getRoleTableClass(): string
	{
		return Model\ExampleRoleTable::class;
	}

    /**
     * @return string
     */
	protected static function getRoleRelationTableClass(): string
	{
		return Model\ExampleRoleRelationTable::class;
	}

    /**
     * @return string
     */
	protected static function getPermissionTableClass(): string
	{
		return Model\ExamplePermissionTable::class;
	}

    /**
     * @return string|null
     */
	public static function getRoleDictionaryClass(): ?string
	{
		return RoleDictionary::class;
	}

    /**
     * @return string
     */
    protected static function getUserGroupTableClass(): string
    {
        return UserGroupTable::class;
    }
}

规则

每条规则都在单独的文件中描述。

local/modules/kosmos.example/lib/Domain/Access/Rule/CreateRule.php

<?php

namespace Kosmos\Example\Domain\Access\Rule;

use Bitrix\Main\Access\AccessibleItem;
use Bitrix\Main\Access\Rule\AbstractRule;
use Kosmos\Example\Domain\Access\Permission\PermissionDictionary;

class CreateRule extends AbstractRule
{
    public function execute(AccessibleItem $item = null, $params = null): bool
    {
        if ($this->user->isAdmin()){
            return true;
        }

        if ($this->user->getPermission(PermissionDictionary::EXAMPLE_CREATE)){
            return true;
        }

        return false;
    }
}

输出界面的配置

local/modules/kosmos.example/lib/Domain/Access/Component/ExampleConfigPermissions.php

<?php

namespace Kosmos\Example\Domain\Access\Component;

use Kosmos\Example\Domain\Access\ActionDictionary;
use Kosmos\Example\Domain\Access\Permission\PermissionDictionary;
use Kosmos\Example\Domain\Access\Role\RoleUtil;
use Kosmos\Example\Domain\Access\ExampleAccessController;
use Kosmos\Access\Component\ConfigPermissions;

class ExampleConfigPermissions extends ConfigPermissions
{
    /**
     * @return array[]
     */
	protected function getSections(): array
	{
		return [
            'SECTION_ADMIN' => [
                PermissionDictionary::ADMIN
            ],
            'SECTION_EXAMPLE' => [
                PermissionDictionary::EXAMPLE_CREATE,
                PermissionDictionary::EXAMPLE_EDIT_OWN,
                PermissionDictionary::EXAMPLE_EDIT_ALL
            ]
		];
	}

    /**
     * @return string
     */
    protected function getPermissionDictionaryClass(): string
    {
        return PermissionDictionary::class;
    }

    /**
     * @return string
     */
    public function getRoleUtilClass(): string
    {
        return RoleUtil::class;
    }

    /**
     * @return string
     */
    public static function getModuleId(): string
    {
        return 'kosmos.example';
    }

    /**
     * @return string
     */
    public function getAccessControllerClass(): string
    {
        return ExampleAccessController::class;
    }

    /**
     * @return string
     */
    public function getActionDictionaryClass(): string
    {
        return ActionDictionary::class;
    }
}

用户模型

local/modules/kosmos.example/lib/Domain/Entity/UserModel.php

<?php

namespace Kosmos\Example\Domain\Entity;

use Kosmos\Example\Infrastructure\Model\ExamplePermissionTable;
use Kosmos\Example\Infrastructure\Model\ExampleRoleRelationTable;
use Kosmos\Access\Entity\UserModel as Base;

class UserModel extends Base
{
    protected function getPermissionTableClass(): string
    {
        return ExamplePermissionTable::class;
    }

    protected function getRoleRelationTableClass(): string
    {
        return ExampleRoleRelationTable::class;
    }
}

实体模型

实体模型可能不存在。

local/modules/kosmos.example/lib/Domain/Entity/Example.php

<?php

namespace Kosmos\Example\Domain\Entity;

use Bitrix\Main\Access\AccessibleItem;
use Kosmos\Example\Infrastructure\Model;

class Example extends Model\EO_Example implements AccessibleItem
{
    public static function createFromId(int $itemId): AccessibleItem
    {
        ...
    }

    public function getId(): int
    {
        return (int) parent::getId();
    }
}

设置页面

要添加指向页面的菜单项,可以使用文件local/modules/kosmos.example/admin/menu.php。标题和链接可以程序化获取。

'text' => ExampleConfigPermissions::getTitle(),
'url' => ExampleConfigPermissions::getUri()

使用

更多示例可以在文档中找到。

检查执行动作的可能性

use Kosmos\Example\Domain\Access\ActionDictionary;
use Kosmos\Example\Domain\Access\ExampleAccessController;

ExampleAccessController::can(
    $userId,
    ActionDictionary::ACTION_CREATE,
    $this->example->getId()
)

如果需要,可以将实体显式传递给控制器。

use Kosmos\Example\Domain\Access\ActionDictionary;
use Kosmos\Example\Domain\Access\ExampleAccessController;

ExampleAccessController::can(
    $userId,
    ActionDictionary::ACTION_CREATE,
    $this->example->getId(),
    ['entity' => $this->example]
)

拥有特定权限的用户标识符列表

use Kosmos\Example\Domain\Access\Role\RoleUtil;
use Kosmos\Example\Domain\Access\Permission\PermissionDictionary;

$userIdList = RoleUtil::getMembersByPermission(PermissionDictionary::EXAMPLE_CREATE)