2008年9月25日木曜日

Google App EngineのDjangoヘルパーで認証してみる

Djangoヘルパーを使えばApp Engine上でも簡単に独自の認証システムを導入できると思ってたら、どうやらそうじゃないみたい。
あくまでUsers API前提の仕様みたいです。

それでもデコレーターとかタグとか色々便利そうなので使ってみることにしました。


モデル

user という UserProperty が入っているのがDjangoオリジナルと違う所。
もうひとつ違う点は get_djangouser_for_user というクラスメソッドが追加されています。

appengine_django.auth.models

class User(BaseModel):
user = db.UserProperty(required=True)
username = db.StringProperty(required=True)
first_name = db.StringProperty()
last_name = db.StringProperty()
email = db.EmailProperty()
password = db.StringProperty()
is_staff = db.BooleanProperty(default=False, required=True)
is_active = db.BooleanProperty(default=True, required=True)
is_superuser = db.BooleanProperty(default=False, required=True)
last_login = db.DateTimeProperty(auto_now_add=True, required=True)
date_joined = db.DateTimeProperty(auto_now_add=True, required=True)
groups = EmptyManager()
user_permissions = EmptyManager()

@classmethod
def get_djangouser_for_user(cls, user):
query = cls.all().filter("user =", user)
if query.count() == 0:
django_user = cls(user=user, email=user.email(), username=user.nickname())
django_user.save()
else:
django_user = query.get()
return django_user


初回ログイン時に自動的にDatastoreにユーザー情報が放り込まれるようです。

あとは普通のDjangoの認証システムとあまり変わりません。
viewで request.user.is_authenticated() のようなメソッドが使えます。


デコレーター
from appengine_django.auth.decorators import login_required

@login_required
def index(request):
・・・

これだけでログインしていないユーザーを弾くことができます。


テンプレート

{% auth_login_url %} => ログインのURL
{% auth_logout_url %} => ログアウトのURL


Google App Engine Helper for Django
(http://code.google.com/p/google-app-engine-django/)

0 件のコメント: