24

管理者から、モデルからのデータの追加、変更、または削除を許可する権限をユーザーまたはユーザーグループに割り当てることができることがわかりました。

これは素晴らしいことですが、ユーザーまたはユーザー グループがビューのグループにアクセスできるようにするか、ビューのグループにアクセスできないようにする必要もあります。Web サイトに特定の種類のサービスがあるため、一部のユーザーが特定のサービス (ページ/ビュー) にアクセスできるようにし、他のユーザーはアクセスできないようにしたいと考えています。

では、特定のユーザー/ユーザー グループが特定のビューにアクセスできるようにするにはどうすればよいでしょうか? ありがとうございました!

4

5 に答える 5

26

特定のモデルを追加または変更できないユーザーは、管理者でそれを見ることができません。

カスタム作成されたビューについて話している場合は、ユーザーの権限をチェックし、権限がない場合は 404 を返すものを作成できます。権限はモデルにリンクされており、グループにはさまざまな権限を割り当てることができます。

次のように、モデルにパーミッションを追加できます。

# myproject/myapp/models.py

class MyModel(models.Model):
    class Meta:
        permissions = (
            ('permission_code', 'Friendly permission description'),
        )

次に、ユーザーに次のような権限があるかどうかを確認できます。

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

アクセス許可を使用すると、管理インターフェイスを使用するだけで、ユーザーやグループからそれらを簡単に追加または削除できます。

于 2011-01-04T19:15:17.480 に答える
10

手動で管理する必要がありますが、とても簡単です。おそらく、グループがビューを表示する権限を持っているかどうかを決定する属性があると思われます。ユーザーが特定の権限を持っているかどうかという単純な質問の場合、またはもう少し複雑なpermission_required場合は、デコレータでそのビューを装飾するだけです。 user_passes_test:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
    ...etc...

is_allowed_to_see_view_myviewそれが User オブジェクトの何らかのメソッドであると仮定します。

認証ドキュメントはかなり包括的です。

于 2011-01-04T19:23:59.400 に答える
4

クラスベースのビューの場合、クラスをビューに継承 UserPassesTestMixinして定義できますtest_func

from django.contrib.auth.mixins import UserPassesTestMixin

class MainView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.has_perm('app.get_main_view')

これを使用する方法の詳細については、このドキュメントをご覧ください。

于 2016-11-21T17:19:10.813 に答える
1

権限システムはモデル中心であり、権限がモデルに関連付けられていることを前提としています。次の 2 つの選択肢が最適なオプションだと思います。

A. ビューが特定のモデルに関連している場合は、Marcus Whybrow が提案したように、そのモデルでカスタム権限を使用してください。

B. [テストされていないため、動作しない可能性があります] サブクラスUserを作成し、そこで独自のアクセス許可を定義します。実際のモデルは必要ありません。アプリのカスタム パーミッションの単なるラッパーです。

from django.contrib.auth.models import User
class MyUser(User):
    class Meta:
        permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))

syncdbカスタム権限をデータベースに追加するために実行することを忘れないでください。

于 2011-01-05T01:10:13.267 に答える