2009-08-13 6 views
6

なぜ必要なデコレータが動作していないのか分かりません。私は、スタッフだけのためのビューへのアクセスを許可したいと思います。私はスーパーユーザーとしてpermission_requiredデコレータが私のために働いていない

@permission_required('request.user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

とも

@permission_required('user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

を試してみましたが、私は、ビューにアクセスすることができますが、私はスタッフとして作成したユーザーがそれにアクセスすることはできませんし、ログインURLページにリダイレクトされます。私はlogin_requiredデコレータをテストし、それは正常に動作します。

答えて

22

permission_required()には、文字列内のPython式ではなくアクセス許可名を渡す必要があります。代わりにこれを試してみてください:

from contrib.auth.decorators import user_passes_test 
def staff_required(login_url=None): 
    return user_passes_test(lambda u: u.is_staff, login_url=login_url) 

@staff_required(login_url="../admin") 
def series_info(request) 
... 

感謝。それはうまくいく。 の使用方法の例は ですか?permission_required? のドキュメント docs.djangoproject.com/en/1.0/...と djangobook.com/jp/2.0/chapter14 I は私が何をすべきかを考えました。

投稿したリンクを再読します。 permission_required()は、ユーザーに特定のアクセス許可が与えられているかどうかをテストします。ユーザーオブジェクトの属性はテストされません。 http://www.djangobook.com/en/2.0/chapter14/から

def vote(request): 
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): 
     # vote here 
    else: 
     return HttpResponse("You can't vote in this poll.") 

    # 
    # 
# # # 
    ### 
    # 

def user_can_vote(user): 
    return user.is_authenticated() and user.has_perm("polls.can_vote") 

@user_passes_test(user_can_vote, login_url="/login/") 
def vote(request): 
    # vote here 

    # 
    # 
# # # 
    ### 
    # 

from django.contrib.auth.decorators import permission_required 

@permission_required('polls.can_vote', login_url="/login/") 
def vote(request): 
    # vote here 
+0

ありがとうございました。それはうまくいく。 permission_requiredの使用方法の例がありますか?ドキュメントhttp://docs.djangoproject.com/en/1.0/topics/auth/#the-permission-required-decoratorとhttp://www.djangobook.com/en/2.0/chapter14/から私は何を考えましたか?仕事があったはずだった。 – Mitch

+0

ああ。そうですか。忍耐してくれてありがとう。 – Mitch

+2

最後に** 'polls.can_vote' **パラメータについて何が起こっているのか説明してください。それの目的は何ですか?それはどこを指していますか?それはおそらくグループの名前ですか、メンバーでなければなりませんか? –

1

ここでは、私は理解していない動作の例です。私は、ユーザーを作成し、 'is_staff'を確認するpermission_requiredでテスト関数をリクエストし、装飾します。ユーザーがスーパーユーザーの場合、テスト機能にアクセスが許可されます。ユーザーがis_staff = Trueのみの場合、アクセスは許可されません。

from django.http import HttpRequest 
from django.contrib.auth.models import User 
from django.contrib.auth.decorators import permission_required 

@permission_required('is_staff') 
def test(dummy='dummy'): 
    print 'In test' 

mb_user = User.objects.create_user('mitch', '[email protected]', 'mbpassword') 
mb_user.is_staff = True 

req = HttpRequest() 
req.user = mb_user 

test(req) # access to test denied - redirected 

req.user.is_staff = False 

test(req) # same as when is_staff is True 

req.user.is_superuser = True 
test(req) # access to test allowed 
+1

is_staffはユーザオブジェクトの属性であり、パーミッションではありません。 'Django> = 1.9'の場合は –

3

これは私がそれを行うだろうかです:

from django.contrib.admin.views.decorators import staff_member_required 

@staff_member_required 
def series_info(request): 
    ... 

ドキュメントはstaff_member_requiredについてこう述べています。

デコレータユーザーがログインしていることを確認し、スタッフのメンバーであるビューについて必要に応じてログインページを表示します。ところで

0

、あなたはmethod_decoratorデコレータ(行くの図)で、あなたのデコレータをラップする必要があり、クラスベースのビューを使用している場合:

class MyView(DetailView): 
    ... 
    @method_decorator(permission_required('polls.can_vote', login_url=reverse_lazy('my_login'))) 
    def dispatch(self, request, *args, **kwargs): 
     .... blah .... 

class MyModel(models.Model): 
    ... 
    def has_perm(self perm, obj=None): 
     if perm == 'polls.canvote': 
      return self.can_vote() 
+1

です。[PermissionRequiredMixin](https://docs.djangoproject.com/ja/dev/topics/auth/default/#the-permissionrequiredmixin-mixin)を'クラスベースのビュー 'で使うことができます –

0

これは私の「プロジェクトの上で私の作品テーブル/モデル:

@permission_required('myApp.add_project') 
def create(request): 
    # python code etc... 

明らかにADD_にadd_projectを変更[モデル/表があるものは何でも]。編集するには:

@permission_required( 'myApp。edit_project「)

および削除する:

@permission_required(」myApp.delete_project ')

しかし、私は重要なことは、あなたの認証テーブルが正しく設定されていることを確認することであることがわかりました。これが私の問題を引き起こした原因です。あなたがグループを使用している場合に、権限をチェックするために書いたMySQL SQLクエリです。これは、ほとんどのdBで動作するはずです:

select usr.id as 'user id',usr.username,grp.id as 'group id',grp.name as 'group name',grpu.id as 'auth_user_groups',grpp.id as 'auth_group_permissions',perm.name,perm.codename 
from auth_user usr 
left join auth_user_groups grpu on usr.id = grpu.user_id 
left join auth_group grp on grpu.group_id = grp.id 
left join auth_group_permissions grpp on grp.id = grpp.group_id 
left join auth_permission perm on grpp.permission_id = perm.id 
order by usr.id; 

私は私の権限が正しく設定されていなかったことが判明し、また追加のそれぞれについて、それぞれのアプリとテーブルの行を持っている必要がありますたdjango_content_typeテーブルに気をつけ、編集、削除します。あなたは、プロジェクトのテーブルを持っているのであれば、あなたがたdjango_content_typeでこれが表示されます。

id   [generated by dB] 
app_label myApp 
model  project 

あなたは別の良いアイデア問題がある場合Djangoの管理アプリを有効にして使用することです。これはあなたの問題がどこにあるかを示し、いくつかのテスト権限、ユーザ、グループを設定することで、上で説明したテーブルを調べて、どこに何が挿入されているかを調べることができます。これにより、認証許可の仕組みがわかります。

私はこれを書いて、多分、私が何をしたかを考え出すのに2,3時間を費やす必要がなくなりました!

関連する問題