2017-06-12 5 views
0

Django Rest FrameworkでDjango 1.11を使用し、高度な許可システムを実装しようとしています。DRF:各応答にデータを追加する

現在、私たちにはいくつかの問題があります。そのうちの1つは、すべての要求に応じて現在ログインしているユーザー(request.userによる)のリンクされたアクセス許可を返します。

例:エンドポイントhttp://localhost:8000/articles/1/は、その記事に関する情報とリンクされた権限をユーザーに返す必要があります。このような 何か:

{'title': 'Article Title', 'pages': 50, 'permissions': ['can_read_article', 'can_update_article'] ...} 

これらの権限はDjangoの管理]> [ユーザー&グループシステム内部で管理されるべきです。

どうもありがとう、任意のヘルプは、あなたがその情報をつかむためにSerializer Method Fieldを使用することによって、これを達成しようとすることができます

+0

既に、各エンティティにアクセス権をリンクするものがありますか?たとえばForeignKey? –

+0

すべてがDjango Adminアプリケーションによって管理されています。ユーザーは権限を持つグループにリンクされています。 –

+0

ああ、あなたは現在提供されているエンティティに関連するアクセス許可の後ではなく、ユーザー自身のためのアクセス権ですか?それは不思議そうです。記事のリクエストは、その記事の詳細を取得する必要があります。リクエストしているユーザーに関する無関係な情報ではありません。 –

答えて

0

を理解されるであろう。

class ArticleSerializer(serializers.ModelSerializer): 
    permissions = serializers.SerializerMethodField() 

    def get_permissions(self, obj): 
     user = self.context['request'].user 

     # compute permissions 
     #permissions = user.get_all_permissions() # if you are using Django's permissions, see note below 
     permissions = get_perms(user, obj) # if you are using django-guardian 

     return permissions 

注意あなたがdjango.contrib.authそこからDjangoの権限を使用している場合は、そのオブジェクトレベルの権限はありません。私はあなたのアプローチが最適なものではありません。各要求に対してすべての権限を返す代わりに、別々の呼び出しですべてのユーザーの権限を取得し、フロントエンドのどこかに保存する方が効率的ですそれは後で。 一方、django-guardianのようなオブジェクトレベルのアクセス許可を使用している場合は、この方法が適しているようです。

関連する問題