1

現在、Eve v0.4 は「auth_field」を介した User-Restricted Resource Access をサポートしていますが、単一所有者のケースを自動的に処理するように設計されているようです。

許可された ID の配列に ID が含まれていた場合に、ユーザーがリソースを表示できるマルチユーザーの制限付きアクセスを有効にするにはどうすればよいでしょうか? 個別の読み取りおよび書き込みアクセス許可の複数のリストを持つ可能性があります。

4

2 に答える 2

4

この機能を追加する EVE の小さなハックを書きました。少しトリッキーかもしれませんが、うまくいきます。

EVE の fdec 関数 auth.py を更新する必要があります。

def fdec(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if args:
            # resource or item endpoint
            resource_name = args[0]
            resource = app.config['DOMAIN'][args[0]]
            if endpoint_class == 'resource':
                public = resource['public_methods']
                roles = resource['allowed_roles']
                if request.method in ['GET', 'HEAD', 'OPTIONS']:
                    roles += resource['allowed_read_roles']
                else:
                    roles += resource['allowed_write_roles']
            elif endpoint_class == 'item':
                public = resource['public_item_methods']
                roles = resource['allowed_item_roles']
                if roles and isinstance(roles, str):
                    items = app.data.driver.db[args[0]]
                    item = items.find_one(kwargs)
                    roles = item[roles]
                if request.method in ['GET', 'HEAD', 'OPTIONS']:
                    roles += resource['allowed_item_read_roles']
                else:
                    roles += resource['allowed_item_write_roles']
            if callable(resource['authentication']):
                auth = resource['authentication']()
            else:
                auth = resource['authentication']
        else:
            # home
            resource_name = resource = None
            public = app.config['PUBLIC_METHODS'] + ['OPTIONS']
            roles = app.config['ALLOWED_ROLES']
            if request.method in ['GET', 'OPTIONS']:
                roles += app.config['ALLOWED_READ_ROLES']
            else:
                roles += app.config['ALLOWED_WRITE_ROLES']
            auth = app.auth
        if auth and request.method not in public:
            if not auth.authorized(roles, resource_name, request.method):
                return auth.authenticate()
        return f(*args, **kwargs)
    return decorated
return fdec

ご覧のとおり、条件を追加しました。 . たとえば、次のスキームとグループの定義があります。

definition = {
    'url': 'groups',
    'item_title': 'group',
    # only admins and apps are allowed to consume this endpoint
    'cache_control': '',
    'cache_expires': 0,
    'id_field': 'url',
    'schema': _schema,
    'allowed_item_roles': 'users',
    'additional_lookup': {
        'url': 'regex("[\w]+")',     # to be unique
        'field': 'url',
    },
}

_schema = {
    'name': required_string,  # group name
    'url': unique_string,       # group url - unique id
    'users': {                  # list of users, who registered for this group
        'type': 'list',
        'scheme': embedded_object('accounts')
    },
    'items': {                  # list of items in the group
        'type': 'list',
        'scheme': embedded_object('items'),
    },
    'owner': embedded_object('accounts'),
    'secret': {'type': 'string'}

}

ご覧のとおり、アカウントの埋め込みオブジェクトであるユーザーのリストがあります。次のステップは、ロール認証を更新することです。次のようになります。

def check_auth(self, token, allowed_roles, resource, method):
    accounts = app.data.driver.db['accounts']
    lookup = {'token': token}
    if allowed_roles:
        # only retrieve a user if his roles match ``allowed_roles``
        lookup['username'] = {'$in': allowed_roles}
    account = accounts.find_one(lookup)
    if account and 'username' in account:
        self.set_request_auth_value(account['username'])
    if account:
        self.request_auth_value = account['username']
    return account is not None

したがって、ユーザー名が許可された役割にあるかどうかを確認します。最後のステップは、EVE のflaskapp.py を更新して、allowed_roles の文字列をサポートすることです。

def validate_roles(self, directive, candidate, resource):
    """ Validates that user role directives are syntactically and formally
    adeguate.

    :param directive: either 'allowed_[read_|write_]roles' or
                      'allow_item_[read_|write_]roles'.
    :param candidate: the candidate setting to be validated.
    :param resource: name of the resource to which the candidate settings
                     refer to.

    .. versionadded:: 0.0.4
    """
    roles = candidate[directive]
    if not (isinstance(roles, list) or isinstance(roles, str)):
        raise ConfigException("'%s' must be list"
                              "[%s]." % (directive, resource))

とにかく、これは回避策であり、アイテムごとに何千人ものユーザーがいる場合に高速で信頼できるかどうかはわかりませんが、少数のユーザーの場合は機能します。

それが役立つことを願っています

于 2014-12-07T17:37:09.513 に答える
1

ユーザー制限付きリソース アクセスは、基本的に、ドキュメントを作成したユーザーの ID をドキュメント自体と共に透過的に格納するためのメカニズムです。ユーザーがエンドポイントに戻ると、自分のドキュメントのみを表示/編集します。ドキュメントを保存するときに、ドキュメントに複数の「所有者」をどのように割り当てますか?

Role Based Access Controlを調べましたか? エンドポイント(ドキュメントではない)レベルではありますが、あなたが求めていることを行います。

于 2014-07-16T06:59:29.050 に答える