Django Authenticationのパーミッション、グループに関するメモ

Django 1.3の認証システムのパーミッション、グループに関するメモです。
Django | User authentication in Django | Django documentationから自分が気になった部分だけ適当に訳したものです。(Django Documentationのライセンスに関する表記を見つけられなかったので、もし問題がありましたらお知らせ下さい)

認証システム

認証システムには
ユーザ(User)
パーミッション(Permission)
グループ(Group)
メッセージ(Message)
があります

注:Authenticationフレームワーク内のMessage機能はDjango 1.4で廃止されます。今後はMessages Frameworkを利用してください。

ユーザ

ユーザをグループに追加

myuser.groups = [group_list]
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()

ユーザにパーミッションを割り当てる

myuser.user_permissions = [permission_list]
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

パーミッション

Djangoでは特定のユーザあるいはグループ(ユーザの集合)にパーミッションを割り当てることができます。

カスタムパーミッション

以下のようにモデルオブジェクトにパーミッションを定義することができます。

class Task(models.Model):
    ...
    class Meta:
        permissions = (
            ("view_task", "Can see available tasks"),
            ("change_task_status", "Can change the status of tasks"),
            ("close_task", "Can remove a task by setting its status as closed"),
        )

パーミッションによってアクセス制限をかける

以下がデコレータを使用した方法です。login_urlはオプショナルな引数でデフォルトはsettings.LOGIN_URLになります。

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url='/loginpage/')
def my_view(request):
    …

さらに複雑な制限をかけるにはuser_passes_testデコレータを使うこともできます。

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')
def my_view(request):
    ...

テンプレート内でパーミッションを扱う

テンプレート変数としてpermsが定義されます。

    <p>You don't have permission to do anything in the foo app.</p>