そこで、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]
コメントを追加