● 遷移先の設定
非ログイン状態の場合に遷移させる URL
ログイン認証後に遷移させる URL を定義する
例)
LOGIN_URL = '/hoge/login/' ※ ログイン画面のURL
LOGIN_REDIRECT_URL = '/hoge/' ※ /loginに直接アクセスした場合のリダイレクト
● パスワードに対するバリデーションを指定できる(ユーザー登録時のチェック)
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
【メモ】
上記内容はプロジェクト作成時に自動的に生成されています。
よって、不要なバリデーションをコメントアウトする場合に設定を変更する程度です。
・UserAttributeSimilarityValidator
Userの入力したパスワードが、username, first_name, last_name, email と類似しているかどうかを検証してくれるclass
lower()で小文字にしたあとSequenceMatcherで文字列比較、quick_ratio()でシーケンスの同一性を測り、類似度が高い場合にエラーメッセージを返す。
・MinimumLengthValidator
パスワードの最小の長さを設定できる
例)
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
・CommonPasswordValidator
よくあるパスワードのリスト.txtと一致したらエラー出すclass
common-passwords.txt.gzというのが、よくあるパスワードリスト。
これを解凍してこのパスワードリストの中に入力されたパスワードがあればエラーメッセージを返す。
・NumericPasswordValidator
数値のみでパスワードが構成されていないかチェックしてくれる
● パスワードのハッシュクラスの指定
一番上のクラスを使って処理する(下に行くほど簡易なハッシュアルゴリズムっぽい)
例)
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.PBKDF2PasswordHasher', ※このクラスが使用されてるっぽい。
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
※平文での登録をカスタマイズする場合は、【独自のユーザー登録画面を作成する】を参考に修正してください。
● アプリ側の urls.py
先ほど設定した LOGIN_URL のアプリに設定する。
例)
LOGIN_URL = '/hoge/login/' の場合は、hoge/urls.py となり、以下の様に設定する
from django.contrib.auth import views as auth_views
urlpatterns = [
~ 省略 ~
url(r'^login/$', auth_views.LoginView.as_view(template_name='hoge/login.html'), name='login'),
url(r'^logout/$', auth_views.LogoutView.as_view(template_name='hoge/logout.html'), name='logout'),
]
● login.html
<form method="post">
{{
form.username.label_tag }}<br>
{{
form.username }}<br>
{{
form.password.label_tag }}<br>
{{
form.password }}<br>
<input type="hidden" name="next" value="{{ next }}" />
{% csrf_token %}
<input type="submit" value="login" />
</form>
【メモ】
form は自動的にアサインされている
● logout.html
ログアウトしました。
● パーミッションの制御
パーミッションの有無はテンプレート変数 {{
perms }} に入っ ています。
例)
{% if perms.kihon.add_syumilist %}
何か書く。
{% endif %}
認証の有無により閲覧可能なページと不可能なページを指定する必要があり、デコレータを使います。
● 関数ベースの場合
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
@login_required
#認証が必要なメソッド
def hello_world(request):
pass
#認証が不要なメソッド
def hello_world2(request):
pass
● クラスベースの場合
from django.contrib.auth.decorators import
login_required
from django.utils.decorators import
method_decorator
@
method_decorator(
login_required, name='dispatch')
class IndexView(View):
#認証が必要なメソッド
def get(self,request):
pass
#認証が必要なメソッド
def post(self,request):
pass
class IndexView2(View):
#認証が不要なメソッド
def get(self,request):
pass
@
method_decorator(
login_required, name='dispatch')
#認証が必要なメソッド
def post(self,request):
pass
【メモ】
デコレータ @
login_required のあるメソッドは、認証が許可されたユーザーのみが閲覧可能なメソッドとなる
認証がない状態でメソッドを処理しようとすると、[settings.py]で設定した LOGIN_URL へリダイレクトされる。
デコレータを使用しない場合は、各処理で以下の様に記述すると同じ効果となる
例)
from django.http import HttpResponseRedirect
def my_view(request):
if not request.user.is_authenticated:
return HttpResponseRedirect('/hoge/login/?next=%s' % request.path)
● パーミッションの制御
権限による制御も可能です。
例)
from django.views.generic import View
from django.contrib.auth.mixins import PermissionRequiredMixin
#PermissionRequiredMixin を継承する
class IndexView(PermissionRequiredMixin, View):
#syumi_list の登録権限がないとはじかれます
permission_required = ('hoge.add_syumilist',)
#True にすると 403 エラーへ遷移する。設定しないとログイン画面へ遷移します
raise_exception = True
#権限 hoge.add_syumilist が必要
def get(self,request):
pass
#権限 hoge.add_syumilist が必要
def post(self,request):
pass
【メモ】
パーミッションはカンマ区切りで複数追記できます。その場合は全ての権限が必要となります。
またパーミッション名は、アプリ名 + . + [auth_permission]テーブルの codename でいけるかも。
またスーパーユーザーはそれだけで全ての権限を持っているので確実に突破できます。
パーミッションはログイン状態のユーザーしか持っていないので、当然非ログイン者は全て弾かれます。
● ユーザー情報
ログインしているユーザーのさまざまな情報を request インスタンスから取得できる
例)
#ユーザー名を返却
request.user.get_username()
#ログイン有無をブーリアンで返却
request.user.is_authenticated
#ユーザー名を返却
request.user.username
#ユーザーが登録されているID番号を返却
request.user.id
#グループの持つパーミッションをリストで返却
request.user.get_group_permissions()
#グループとユーザーのの持つパーミッションをリストで返却
request.user.get_all_permissions()
#ユーザが特定のパーミッションを持っている場合に True を返します。
request.user.has_perm('パーミッション名')
#パーミッション名 perm は[application name].[lowercased model name]のような形式で表します。(例:sessions.delete_session)
#ユーザがパーミッションリスト内の1つでも持っていれば True を返します。
request.user.has_perms(['パーミッション名','パーミッション名'])
#パーミッション名 perm_list は[app label].[permission codename]のような形式で表します。
#指定したグループに所属しているかをブール値で取得する
request.user.groups.filter(name='ほげG').exists()
#ユーザーの所属するグループ一覧名を取得する
request.user.groups.all()
# こんな感じで返却する
request.user.groups.values_list('id','name',flat=False)
# こんな感じで返却する
request.user.groups.values_list('name',flat=True)
#スーパーユーザーかをブール値で取得する
request.user.is_superuser
#スタッフ権限かをブール値で取得する(admin権限)
request.user.is_staff
#アクティブなユーザーかをブール値で取得する
request.user.is_active