Django:1対1のフィールドに基づいてユーザーの「変更/削除可能」権限を制限する

デベイズ

そこで、Django認証ユーザーモデルを拡張するために1対1のフィールドを追加しました。

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    division = models.ForeignKey(Division, on_delete=models.CASCADE)

私が達成したいのは、すべての従業員が他の従業員オブジェクトを変更する権限を持っていることですが、それらが属する同じ部門のオブジェクトに限定されています。

UserオブジェクトとEmployeeオブジェクトを追加/変更/削除する権限を持つ「employee」権限グループを作成しました。

これで、各従業員は、すべての従業員オブジェクトすべてのユーザーオブジェクトの両方に対して「変更可能」な権限を持ちます。

OneToOneFieldでdjangoadmin変更リストをフィルタリングできたので、各従業員は変更リスト内の自分の部門の従業員しか見ることができません。

問題は、別の部門からユーザーを変更するためにURLを手動で入力すると、このユーザーを変更/削除できることです。同様に、スーパーユーザー(ユーザー1)を変更/削除することもできます。ナビゲート先:

http://localhost:8000/admin/auth/user/1/change/

トリックを行います。

これを修正する私の考えは、auth user changeメソッドをオーバーライドして、「division-or-superuser」チェックを追加することでしたが、それはハックのようです。分割に基づいて変更URLへのアクセスを制限したいのですが、これを実現する方法はまだ見つかりません。

提案をありがとう!

ジョン・ムタフィス

UserPassesTestMixinクラスベースのビューで使用して、現在のユーザーに、変更しようとしている従業員の部門に対してテストを強制することができます

changeメソッドがPOST次の例のメソッドであると仮定します。

from django.contrib.auth.mixins import UserPassesTestMixin

class MyView(UserPassesTestMixin, View):

    def test_func(self):
        ch_user_division = Employee.objects.filter(
            pk=self.request.POST.get('user_id')
        ).values('division')
        return self.request.user.division == ch_user_division

これで、クラスベースMyViewは、ユーザーが変更されるユーザーと同じ部門にいるかどうかチェックします。

ユーザーアクセスを制限する方法の詳細については、https//docs.djangoproject.com/en/1.11/topics/auth/default/#limiting-access-to-logged-in-users-that-pass-a-testをご覧ください。


コメントのレガシーの理由で以下を残します:

ForeignKey.limit_choices_toモデル定義で引数を使用できます。これは次のとおりです。

このフィールドがModelFormまたはを使用してレンダリングされるときに、このフィールドで使用可能な選択肢に制限を設定しますadmin

次のことを試してください。

class Employee(models.Model):
    user = models.OneToOneField(
        User, 
        on_delete=models.CASCADE,
        limit_choices_to={'division': division}
    )
    division = models.ForeignKey(Division, on_delete=models.CASCADE)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

djangoのユーザーに基づいてモデルの特定のフィールドを制限する方法

Graphene / Djangoのユーザータイプに基づいてモデルのフィールドアクセスを制限する方法

Django CrispyFormのユーザー権限に基づいて[削除]ボタンを非表示にする

Django Admin でモデルの 1 つのフィールドのみを変更する権限を持つユーザー

Django フィルターを使用してユーザー プロファイルに基づいてデータへのアクセスを制限する

ユーザーの権限に基づいて動的なサイドバーを作成するDjango

EntityFrameworkコアフィルター親レコードは、Childrenユーザー権限に基づいてすべてのChildrenを含みます

ユーザーがPOSTするフィールド値に基づく権限

PHPのユーザーレベルに基づいてユーザーを制限する方法

Plumierのユーザー権限に基づいて再利用可能なカスタム認証を作成する方法

権限名に基づいてユーザーをフィルタリングする

Djangoでユーザーフィールドが変更されたときに権限を更新する

ユーザーのカスタム権限に基づいてビューをフィルタリングする

前のフォームでの選択に基づいて、formtoolsウィザードでDjangoフォームのManyToManyFieldクエリセットを制限する

Laravelのユーザーロールに基づいてデータアクセスを制限する

既存のモデルに基づいてユーザーの表示を制限する

ProgramData内のフォルダーに対するユーザーグループ権限を削除します

openldapのIPアドレスに基づいてユーザーを制限する方法

他のmanytomanyフィールドにDjangoユーザー権限レイアウトを使用する

Apache管理ディレクトリ内の1人のユーザーのみの権限を変更する

mysqlのユーザー権限に基づく行フィルタリング

Djangoスタッフユーザーがモデルの特定のフィールドを変更することを制限(許可)する

HTTP PATCHは、一度に1つのフィールドのみを変更するように制限されていますか?

外部キーを使用して、別のフィールドの値に基づいてフィールドで許可される値を制限する

Djangoのユーザーモデルに権限を追加する

Djangoでの以前のモデルの選択に基づいて、フォームフィールドの選択を制限します

djangoでユーザーの権限を変更するにはどうすればよいですか?

ユーザーがフォルダの内容に対する変更権限を付与したまま、フォルダを削除できないようにするにはどうすればよいですか?

ビューの条件に基づいてフォームの必須フィールドを変更する(Django)

TOP 一覧

  1. 1

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    CSSのみを使用して三角形のアニメーションを作成する方法

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    ZScalerと証明書の問題により、Dockerを使用できません

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Excel - count multiple words per cell in a range of cells

  9. 9

    PictureBoxで画像のブレンドを無効にする

  10. 10

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  11. 11

    スタート画面にシャットダウンタイルを追加するにはどうすればよいですか?

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  14. 14

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  15. 15

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  16. 16

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  17. 17

    QGISとPostGIS(マップポイント(米国の地図上にraduisを使用した緯度と経度)

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    ターミナルから「入力ソースの変更」ショートカットを設定する

  20. 20

    パンダは異なる名前の列に追加します

  21. 21

    同じクラスの異なるバージョンを使用したクラスローディング:java.lang.LinkageError:名前の重複クラス定義を試行しました

ホットタグ

アーカイブ