Adminサイトへの認証自作

266 views
Skip to first unread message

宮崎

unread,
Jul 27, 2011, 11:37:49 PM7/27/11
to django-ja
はじめまして。宮崎と申します。

現在、djangoを使用して開発を行っています。
djangoを使用してまだ2週間程度の初心者で、
不明点があるので質問させてください。


1.
django標準のAdminサイトを使用したいと思っているのですが、
Adminサイトを2つ作成しようと思っています。
2つ作成することはでき、Adminサイトへのログイン時の
認証方法を分けようと思っています。
1つはdjango標準の認証、もう一つは独自の認証を行いたいです。
この、Adminサイトへのログイン時、独自の認証を行う方法が
わかりません。

# 認証方法を分ける理由は、2つのAdminサイトの認証で使用する
ユーザテーブルを分けたいからです。
(独自の認証を行う場合は、独自のユーザテーブルを使用したい)

2.
ログイン後のAdminサイトでは、ログイン者の作成したレコードのみを
表示、編集可能にしたいのですが、どのようにすれば実現できますでしょうか?

# ModelAdmin.formfield_for_foreignkey を使用するのかなと思っているの
ですが、いまいち使い方がわかっていません。


環境は下記の通りです。
python:2.7.0
django:1.3

どうぞよろしくお願い致します。

Yasushi Masuda

unread,
Jul 28, 2011, 6:11:07 AM7/28/11
to djan...@googlegroups.com
宮崎さん

おそらく、「全てにアクセスできる上位管理者」と、「自分のレコードだけ管理できるユーザ」のような挙動を期待しているのですよね。

独自の認証で request.user を設定できているという前提で説明します。

1. まず、 admin サイトには、 is_staff が True のユーザしか入れません。そのため、全てのユーザの is_staff
を True にしてしまうと、一度ログインしたら、どちらの admin
サイトにもアクセスできてしまい、認証を二つに分ける意味がありません。そのため、上位管理者でないユーザの is_staff は False
にして、それでもログインできる admin サイトを作ってやる必要があります。

2. 次に、何もカスタマイズしていない admin サイトは、通常、データベース上の全てのモデルインスタンスを検索してしまいます。
admin が特定の(例えば、ログイン中のユーザに関連するインスタンスだけ)のモデルインスタンスだけを取り出すようにしてやる必要があります。

そこで、これらの問題を解決するには、
1. django.contrib.admin.sites.AdminSite をカスタマイズして、 is_staff
でなくてもログインできる AdminSitePlus をつくる。
2. django.contrib.admin.options.ModelAdmin をカスタマイズして、 request.user
に関連するオブジェクトだけ検索する ModelAdminPlus を作る。

そして、一般ユーザ向けの admin site を::
site_for_user = AdminSiteFoo()
AdminSitePlus(MyModel, ModelAdminPlus)
のようにして作ればいいわけです。

1. は、 has_permission() をオーバライドします。
2. は、 queryset() をオーバライドしてください::
return super(ModelAdmin, self).queryset().filter(user=request.user)

みたいにすればいいはずです。

2011年7月28日12:37 宮崎 <taro...@gmail.com>:

> --
> ----------------- http://djangoproject.jp/ -----------------
> You received this message because you are subscribed to the Google Groups "django-ja" group.
> To post to this group, send email to djan...@googlegroups.com
> To unsubscribe from this group, send email to django-ja-...@googlegroups.com
> For more options, visit this group at http://groups.google.com/group/django-ja

--
Yasushi Mausda
http://ymasuda.jp/
whosaysni at twitter/gmail

宮崎

unread,
Aug 1, 2011, 7:31:52 AM8/1/11
to django-ja
Masudaさん

返信ありがとうございます。

連絡が遅くなってしまって申し訳ありません。
Masudaさんのアドバイスを元に、現在開発を行なっております。
ご丁寧な説明のおかげで、目的を達成することができそうです。
最近は本業も忙しく、なかなか時間がとれませんが、
完成しましたらまた改めましてご連絡いたします。

以上です。

宮崎

On 7月28日, 午後7:11, Yasushi Masuda <whosay...@gmail.com> wrote:
> 宮崎さん
>
> おそらく、「全てにアクセスできる上位管理者」と、「自分のレコードだけ管理できるユーザ」のような挙動を期待しているのですよね。
>
> 独自の認証で request.user を設定できているという前提で説明します。
>
> 1. まず、 admin サイトには、 is_staff が True のユーザしか入れません。そのため、全てのユーザの is_staff
> を True にしてしまうと、一度ログインしたら、どちらの admin
> サイトにもアクセスできてしまい、認証を二つに分ける意味がありません。そのため、上位管理者でないユーザの is_staff は False
> にして、それでもログインできる admin サイトを作ってやる必要があります。
>
> 2. 次に、何もカスタマイズしていない admin サイトは、通常、データベース上の全てのモデルインスタンスを検索してしまいます。
> admin が特定の(例えば、ログイン中のユーザに関連するインスタンスだけ)のモデルインスタンスだけを取り出すようにしてやる必要があります。
>
> そこで、これらの問題を解決するには、
> 1. django.contrib.admin.sites.AdminSite をカスタマイズして、 is_staff
> でなくてもログインできる AdminSitePlus をつくる。
> 2. django.contrib.admin.options.ModelAdmin をカスタマイズして、 request.user
> に関連するオブジェクトだけ検索する ModelAdminPlus を作る。
>
> そして、一般ユーザ向けの admin site を::
> site_for_user = AdminSiteFoo()
> AdminSitePlus(MyModel, ModelAdminPlus)
> のようにして作ればいいわけです。
>
> 1. は、 has_permission() をオーバライドします。
> 2. は、 queryset() をオーバライドしてください::
> return super(ModelAdmin, self).queryset().filter(user=request.user)
>
> みたいにすればいいはずです。
>
> 2011年7月28日12:37 宮崎 <tarook...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages