python3.doc_52
R e i - D r e a m
for Laravel
TOP > Python3 > Django(Auth 認証)
Guest
login

最終投稿日:2022年6月18日

Django(Auth 認証)
設定 settings.py
● 遷移先の設定
非ログイン状態の場合に遷移させる 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
● アプリ側の 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'),
]
設定 ***.html
● 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 %}
設定 views.py
認証の有無により閲覧可能なページと不可能なページを指定する必要があり、デコレータを使います。
● 関数ベースの場合
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
きっぷる
ログインしてコメントを残そう!!


レンズモード 【新規購入限定用】
きっぷる