1

私の現在のプロジェクトには、限定された方法で Django のモデルを利用するレガシー コードベースが含まれています。syncdb使用されていません (つまり、モデルは Django で管理されていません)。パーミッションに基づいて特定の列へのアクセスを制限する必要があります (つまり、view_all パーミッションはすべての列を表示しますが、パーミッションはユーザーをいくつかの基本的な列に制限しません)。この権限は、さまざまなテーブルに適用されます。

私がこれを行うことを考えている方法は、単純に SQL を使用して new を挿入することauth_permissionです。ただし、これはcontent_type_id列によって複雑になります。私の理解では、コンテンツ タイプは1 つのモデルに適用され、これは (前述のように) 異なるテーブルに適用する必要があり、確実に実行することはできませんsyncdb

他の誰かがこれらの線に沿って何かを実装しましたか? Django インフラストラクチャを使用しましたか、それとも安全のために別のテーブルを使用することになりましたか? これを信号レベルで実装しましたか、それともモデルが使用される各ポイントで実装しましたか?

ありがとう!

4

4 に答える 4

2

いつでもダミー オブジェクトの周りにカスタム パーミッションを作成できます。つまり、次のようになります。

class ColumnLevelPermissions(models.Model):

    class Meta:
        permissions = (
             ("can_view_column1", "Can view column 1"),
             ("can_view_column2", "Can view column 2"),
        )

次に、データベース呼び出しをフィルタリングするラッパーを作成します(モデルはDjango models.Modelによって管理されていないと言います):

class SelectManager(object):
    def get_columns(user):
        allowed_columns = []
        if user.has_perm('app.can_view_column1'):
            allowed_columns.append('column1')
        return allowed_columns

あとはこれをどう使うかだけです。Database からオブジェクトを dict() として作成し、allowed_columns に表示されている場合は、オブジェクト内の列をキーでフィルター処理することができます。ただし、これは、データベースから冗長データを読み取ることを意味します。もう 1 つの解決策は、列に基づいて "Select" クエリを変更することですが、これはあまり安全な方法ではありません。

オブジェクトがどのように保存され、コードで読み取られるかについての詳細情報は、最良のアプローチを定義するのに役立ちます。

于 2012-06-01T20:51:41.703 に答える
2

あなたが実際に許可グループを探しているように思えます。それらは独立してモデルを簡単に作成できます。ユーザー グループには、実際のアクセス許可を含める必要はありません。

ユーザーが特定のグループに属しているかどうかを確認できます。

def user_in_group(user, group_name):
    return user.groups.filter(name=group_name).count()

次のように使用できます。

def my_view(request):
    if user_in_group(request.user, 'view_all'):
        # do the things
    else:
        # do the other things

# limit this view to 'view_all' users
@user_passes_test(lambda u: user_in_group(u, 'view_all'))
def my_other_view(request):
    # and do some more things

私はあなたが何を意味するのか分かりません

これを信号レベルで実装しましたか、それともモデルが使用される各ポイントで実装しましたか?

明らかに、どの認証方法でも、モデルが表示される場所にチェックを挿入し、許可された列のみを表示するロジックを挿入する必要があります (テンプレートで列のサブセットをレンダリングするなど)。

間違った列がアクセスされないようにするために、適切なフィールド/列へのアクセスを制限し、モデル インスタンスの代わりにプロキシ インスタンスを使用するプロキシ クラスを作成できます。

class SomeModelProxy(object):
    def __init__(self, model_instance, user):
        self.instance = model_instance
        self.user = user

    def save(self, *args, **kwargs):
        self.instance.save(*args, **kwargs)

    # define other methods that are needed...

    def __getattr__(self, name):
        if not name in get_allowed_columns_for_user_somehow(self.user):
            raise AttributeError

        return getattr(self.instance, name)

    def __setattr__(self, name, value):
        if not name in get_allowed_columns_for_user_somehow(self.user):
            raise AttributeError

        setattr(self.instance, name, value)
于 2012-06-03T23:22:05.447 に答える
0

多分これはあなたを助けることができます。使ったことがないのですが、使ってもいいと思います。

ユーザーのグループにいくつかの権限を作成し、そのページ/テンプレートを要求しているユーザーに応じて、いくつかの列または他の列を表示できます(単純な「if」テンプレートタグを使用)。少し面倒かもしれませんが、探しているものを完成させるのに役立つ可能性があります。

それが役に立てば幸い!

于 2012-06-03T06:19:45.763 に答える
0

私が正しく理解していれば、ユーザー/消費者のプロパティに応じて、テーブルのすべて/部分的なオブジェクトを表示する必要があります。ユーザーは、一部の行に部分的にアクセスしたり、他の行に完全にアクセスしたりできません。これはオール オア ナッシングです。

これは、行レベルで多態的な関係を可能にする ContentTypes フレームワークとは関係ありません。ビューで公開されたフィールドをフィルタリングするだけです。

標準のユーザー/グループ クラスを使用する場合は、各テーブルに権限「see_complete_xxx」を追加し、グループを割り当ててから、ビューで (これはおそらく API であり、フィールドをループして json/xml/ に変換します)。グループで許可されているフィールドのみをシリアル化します。

次の行の何か:

from django.forms.models import model_to_dict

class MyModel(models.Model):

    def serialize_full(self):
        return model_to_dict(self)

    def serialize_restricted(self):
        return model_to_dict(self, self.low_level_access_fields)

    def serialize_to_dict(self, user):
        if self.user_can_view_all(user):
            return self.serialize_full
        else:
            return self.serialize_restricted

    @classmethod
    def user_can_view_all(cls, user)
        return user.has_perm('my_model.see_all')

    @classmethod
    def low_level_access_fields(cls)
        return ["id", "name", "nickname"]

そして、このコードのほとんどを mixin に抽出して、必要に応じて使用できます。

于 2012-06-06T11:42:11.047 に答える