Djangoのクッキー、セッション、認証システム認証
ナビゲーション
COOKIE与SESSION
コンセプト
HTTPクッキーが原因を保持することはできませんhttpプロトコルが、実際には、契約の範囲に属していないが、我々は「ホールド」に必要なので、クッキーは、このようなAシナリオの下に生まれています。
作品クッキーです:サーバーから生成されたコンテンツは、ブラウザがローカルに保存された要求を受信、ブラウザの訪問は、ブラウザが自動的にクッキーを持って来るとき、そのサーバは、クッキーの内容によって判断できること「です「A。
クッキーは、「保留」の要件、ある程度解決しますが、クッキー自体が原因では4096バイトまでサポートし、クライアント自体に保存されたクッキーは、傍受または盗難することができるので、何か新しいものの必要性は、それが、あるがより多くのバイトをサポートする、と彼は、サーバー上に保存され、高いセキュリティがあります。それはセッションです。
ステートレスのHTTPプロトコルの特性に基づいている質問、サーバーが訪問者を知らない「誰が。」そして、上記のクッキーは、ブリッジの役割を果たします。
そのユーザーがクッキーを介してアクセスして私たちは、各クライアントの割り当てのユニークなIDクッキーを与えることができ、サーバは、人々に知っています「」その後、我々のIDなど、「アカウントのパスワード」としてクッキーに基づいて異なる、いくつかの時間のためにサーバーに保存された個人情報、など。
要約すると:クッキーは、HTTPステートレスの不足を補う「」人にサーバーを知ることができるように、しかし、テキスト形式のクッキーがローカルに保存され、彼らのセキュリティが貧弱であり、私たちはクッキーによって異なるユーザを識別することができますので、セッションで4096バイトより個人情報及びテキストの保存に対応します。
また、上記のクッキーとセッション共通点は、言語やフレームワークに限定されるものではない何かが実際にあります
アプリケーションログ
はじめに前のセクションでは、我々は、背景ページにジャンプするためのユーザー名とパスワードの正しさを確認した後、ランディングページを作ることができました。しかし、テストはまた、もしバイパスログインページを見つけました。直接入力背景URLアドレスも直接アクセスすることができます。これは明らかに不合理です。実際には、我々は不足しているクッキーと検証とのセッションです。この検証プロセスでは、我々は達成することができますし、他のWebサイトでは、バック・ページを入力するにはログインする必要があります。
私は認証機構のこの種についてお話しましょう。我々は認証を通過した後、ランディングページにアクセスするためにブラウザを使用するたびに。サーバーがブラウザに(123ABCとする)ユニークな文字列のランダムなセットを送信し、クッキーはブラウザ側と呼ばれているものの中に保存されています。そして、サーバは次のようハハハ、ログイン= trueの場合、ユーザ名=ユーザ情報として、利用者の自身の現在の状態に関する保存されます。しかし、このメモリは辞書の形式で保存されている、唯一の重要な問題の辞書はユーザーのだけユニークなクッキーの値です。あなたは、サーバー側のセッション情報を表示するのであれば、それから、理論的には、次のような以下の辞書を見て表示されます
{ '123ABC' { 'ログイン':真、 'ユーザ名:笑'}}
各クッキーは一意であるため、私たちは、あなたのコンピュータ上のブラウザを変更してから、ウェブサイトで上陸も再検証する必要があります。では、なぜ私たちは、理論的に言って、この辞書のようにそれを見ていますか?そのため、大きな辞書がないだけで上記のキーは、値を123ABC値を暗号化されているためということで、安全性を考慮すると値{「ログイン」:trueの場合、「ユーザ名:ハハハ」}サーバー側では、暗号化と同じです。我々は、サーバー上で開くように、セッション情報のようなものを見ても、次のようになり、次の
{ '123ABC':dasdasdasd1231231da1231231}
コードで実装する上で、以下の原則を知っています。
DjangoはCOOKIEを達成しました
クッキーの取得
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
#参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间
Cookieの設定
rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
def set_cookie(self, key, 键
value='', 值
max_age=None, 超长时间
expires=None, 超长时间
path='/', Cookie生效的路径,
浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
cookie传给站点中的其他的应用。
/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
你可用这个参数来构造一个跨站cookie。
如, domain=".example.com"
所构造的cookie对下面这些站点都是可读的:
www.example.com 、 www2.example.com
和an.other.sub.domain.example.com 。
如果该参数设置为 None ,cookie只能由设置它的站点读取。
secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
httponly=False 只能http协议传输,无法被JavaScript获取
(不是绝对,底层抓包可以获取到也可以被覆盖)
): pass
クッキーは、クライアントコンピュータに保存されているので、そう、JavaScriptとjQueryのもクッキーを操作することができます。
<script src='/static/js/jquery.cookie.js'>
</script> $.cookie("key", value,{ path: '/' });
削除クッキー
response.delete_cookie( "cookie_key"、パス= "/"、ドメイン=名)
クッキーは、クライアントに保存されている
利点:
データがクライアント上に存在する、サイトのパフォーマンスを向上させるために、サーバー側の圧力を減らします。
短所:
セキュリティが高くない:それは簡単にクライアントマシン上で閲覧や亀裂のユーザー・セッション情報します
DjangoはSESSIONを達成しました
基本操作
1セッションの設定値は、 ますrequest.session [「セッション名」] =「管理者」なる 2セッションの値を取得し、 セッション名はますrequest.session = [「セッション名」]せる 。3、セッション値を削除 デルますrequest.session [「セッション名」]せる 。4、かどうかを検出しますセッション値を操作する 「セッション名は」ますrequest.sessionの場合:
。5、GET(キー、デフォルト=なし) fav_color = request.session.get( 'fav_color'、 '赤') 。6、POP(キー) fav_color = request.session.pop( 'fav_color') 。7、キー() 。8 、項目() 9は、SetDefault() 10、フラッシュ()現在のセッションデータを削除し、セッションクッキーを削除します。 これは、以前のセッションデータは、再びユーザーのブラウザにアクセスすることができないことを保証するために使用され 、たとえば、django.contrib.auth.logout()関数は、それと呼ばれています。 11ユーザセッションランダムな文字列 request.session.session_key #の有効期限は、すべてのセッションを削除するには少ない現在の日付データよりもなります )(request.session.clear_expired データベース内のユーザー・セッションかどうかを確認するために、ランダムな文字列#を 」(request.session.exists SESSION_KEY「) #は、すべての現在のユーザーのセッションデータの削除 request.session.delete(」SESSION_KEYを「) request.session.set_expiry(値) *値が整数の場合、セッションは秒のいくつかの数の後に期限切れになります。 *値はdatatimeかはtimedeltaをされた場合、セッションはこの時間の後に期限切れになります。 値が0の場合は*、ユーザーがブラウザセッションが失敗します閉じます。 *値がNoneの場合、セッションがグローバルセッション有効期限ポリシーに依存します。
フロー分析チャート
例
def log_in(request):
if request.method=="POST":
username=request.POST['user']
password=request.POST['pwd']
user=UserInfo.objects.filter(username=username,password=password)
if user:
#设置session内部的字典内容
request.session['is_login']='true'
request.session['username']=username
#登录成功就将url重定向到后台的url
return redirect('/backend/')
#登录不成功或第一访问就停留在登录页面
return render(request,'login.html')
def backend(request):
print(request.session,"------cookie")
print(request.COOKIES,'-------session')
"""
这里必须用读取字典的get()方法把is_login的value缺省设置为False,
当用户访问backend这个url先尝试获取这个浏览器对应的session中的
is_login的值。如果对方登录成功的话,在login里就已经把is_login
的值修改为了True,反之这个值就是False的
"""
is_login=request.session.get('is_login',False)
#如果为真,就说明用户是正常登陆的
if is_login:
#获取字典的内容并传入页面文件
cookie_content=request.COOKIES
session_content=request.session
username=request.session['username']
return render(request,'backend.html',locals())
else:
"""
如果访问的时候没有携带正确的session,
就直接被重定向url回login页面
"""
return redirect('/login/')
def log_out(request):
"""
直接通过request.session['is_login']回去返回的时候,
如果is_login对应的value值不存在会导致程序异常。所以
需要做异常处理
"""
try:
#删除is_login对应的value值
del request.session['is_login']
# OR---->request.session.flush() # 删除django-session表中的对应一行记录
except KeyError:
pass
#点击注销之后,直接重定向回登录页面
return redirect('/login/')
===================================login.html==================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
<p>用户名: <input type="text" name="user"></p>
<p>密码: <input type="password" name="pwd"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
===================================backend.html==================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>hello {{ username }}</h3>
<a href="/logout/">注销</a>
</body>
</html>
essionストアード設定 1.構成データベース(デフォルト) django_sessionテーブル:Djangoのセッション・サポート・デフォルト、デフォルト、すなわちデータストレージセッションデータベースです。 。設定settings.py SESSION_ENGINE =「django.contrib.sessions.backends.db」#エンジン(デフォルト) SESSION_COOKIE_NAME =すなわちブラウザ、上のクッキーに保存されている「セッションID」#セッションキー:セッションID =ランダムな文字列(デフォルト) セッションのクッキーの保存パスSESSION_COOKIE_PATH = "/" #(デフォルト) SESSION_COOKIE_DOMAINは保存なし#Cookieドメインのセッション(デフォルト)= SESSION_COOKIE_SECURE = Falseの#かどうかHTTPS転送クッキー(デフォルト) SESSION_COOKIE_HTTPONLY = Trueの#かどうか、セッションクッキーのみサポートのHTTP送信(デフォルト) クッキーの有効期限のSESSION_COOKIE_AGE = 1209600#セッションを(2週間)(デフォルト) SESSION_EXPIRE_AT_BROWSER_CLOSE = Falseの#あなたは、ブラウザのセッションが期限切れになり閉じている場合(デフォルト) SESSION_SAVE_EVERY_REQUEST = Falseのセッション#すべてのリクエストであれば、唯一のデフォルトへの変更を保存した後(デフォルト)を保存
2.キャッシュの設定
。settings.py設定 SESSION_ENGINE =「django.contrib.sessions.backends.cache」#エンジン SESSION_CACHE_ALIAS =「デフォルト」#エイリアスを使用した緩衝液(デフォルトのキャッシュメモリ、メモリキャッシュでもよい)、別名キャッシュ依存によって提供 SESSION_COOKIE_NAMEブラウザキーに#セッションのクッキーを「セッションID」とき=、つまり:セッションID =ランダムな文字列 SESSION_COOKIE_PATH =「/」#は、セッションクッキーのパスが保存された CookieドメインのSESSION_COOKIE_DOMAIN =なし#セッションを保存 SESSION_COOKIE_SECURE = Falseの# HTTPS転送クッキーされている SESSION_COOKIE_HTTPONLY = trueを#セッションCookieはHTTPのみの伝送をサポートするかどうか SESSION_COOKIE_AGE = 1209600#セッションクッキーの有効期限(2週間) SESSION_EXPIRE_AT_BROWSER_CLOSEを=あなたは、ブラウザを閉じた場合はFalse#は、セッションが期限切れになります 各要求セッションの保存は、デフォルトを変更した後、保存されたかどうかSESSION_SAVE_EVERY_REQUEST = Falseの#
3.設定ファイル
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
認証の認証システム
認証モジュール
django.contribインポート認証から
django.contrib.authは、多くの方法が、ここではそれらの3に焦点を当てて提供しています。
1つの認証()
ユーザ名とパスワードが正しい検証し、ユーザー認証を提供し、それは通常、ユーザ名・パスワード2つのキーワード引数を取り
認証情報が有効であれば、それはユーザーオブジェクトを返します。認証は()ユーザー認証バックエンド認証とログイン情報は、後工程である識別が必要であることをユーザーオブジェクトの属性に提供されます。我々は認証なしでデータベースから直接取り出し()ユーザオブジェクトを上陸しようとしたときに文句を言うでしょう!!
ユーザー=認証(ユーザ名= '誰か'、パスワード= 'somepassword')
2ログイン(HttpRequestの、ユーザー)
この関数は、HttpRequestを対象と認定Userオブジェクトをとり
この関数は、セッションIDやその他の情報を添付するために認証されたユーザのセッションDjangoフレームワークを使用します。
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
3ログアウト(リクエスト)ログアウト
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
この関数は、HttpRequestのオブジェクト、ノーリターン値をとります。関数が呼び出されると、現在の要求は、すべてのセッション情報をクリアします。ユーザーがログインしていない場合であっても、この機能も文句はありません使用します。
4)(is_authenticated
要件:
1人のユーザーは、一部のページにアクセスするには、ログイン
2ユーザーは、このページにアクセスするにはログインしていない場合は、ログインページに直接スキップ
ユーザーの後に3がジャンプ着陸ログイン画面を完了し、自動的にアクセスアドレスへのジャンプが前に訪れました
1 2 3 4 |
|
私たちはこのような状況のためにデコレータを設計するために#Djangoは良いされています:login_requier
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
ユーザーがログインしていない場合、それはDjangoのデフォルトのログインURLにジャンプします「/アカウント/ログイン/」(この値は設定ファイルにLOGIN_URLによって変更することができます)。そして、(成功した着陸した後、あなたがパスにリダイレクトされます)絶対パスにアクセスするために現在のURLを渡します。
ユーザーオブジェクト
ユーザーオブジェクトプロパティ:データベースに保存されているユーザ名、パスワード(必須)パスワードハッシュアルゴリズムを使用して
is_staff:ユーザーがサイトの管理者権限を持っているかどうか。
is_active:無効ユーザのログインを `` False``に、することはできません削除、ユーザーへのユーザーのログインを許可するかどうかを、セット
is_authenticated 2.1()
それは、ユーザーオブジェクト、Trueに定数の戻り値がtrueの場合。ユーザーが認証を通過しているかどうかをチェックします。
認証によっても、ユーザーはユーザーのみによる認証の成功を示すアクティブ状態であるかどうかを確認していない、ユーザーは何の権利を持っていないことを意味するものではありません。このメソッドは、ユーザーがバックグラウンドでrequest.user.is_authenticatedでログインしているかどうかを判断するために)(、非常に重要であり、真の場合は、フロントデスクのrequest.user.nameを表示することができます
2.2ユーザーの作成
ユーザーCREATE_USERヘルパーを作成します。
django.contrib.auth.modelsからユーザーのインポート ユーザー= User.objects.create_user(ユーザー名= ''、パスワード= ''、Eメール= '')
2.3 check_password(passwdファイル)
用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回
True
def change_password(request):
if request.is_ajax():
data = json.loads(request.POST.get('data'))
oldPassword = data.get('oldPassword')
newPassword = data.get('newPassword')
confirmPassword = data.get('confirmPassword')
if request.user.check_password(oldPassword): # 判断旧密码是否正确
request.user.set_password(newPassword)
request.user.save()
result = {'status': 0, "info": "密码修改登录成功!!"}
else:
result = {'status': 1, "info": "原密码不正确!!"}
return HttpResponse(json.dumps(result))
return render(request, 'changepassword.html')
2.4パスワードの変更
使用して、パスワードを変更する)(set_password:
def change_password(request):
if request.is_ajax():
data = json.loads(request.POST.get('data'))
oldPassword = data.get('oldPassword')
newPassword = data.get('newPassword')
confirmPassword = data.get('confirmPassword')
if request.user.check_password(oldPassword): # 判断旧密码是否正确
request.user.set_password(newPassword) # 设置密码
request.user.save()
result = {'status': 0, "info": "密码修改登录成功!!"}
else:
result = {'status': 1, "info": "原密码不正确!!"}
return HttpResponse(json.dumps(result))
return render(request, 'changepassword.html')
例
from django.shortcuts import render, HttpResponse, redirect
from . import models
from utils import page
import json
from django.db.models import Count, Max
from django.contrib import auth
from django.contrib.auth.models import User
# Create your views here.
# 登录注册,验证, 注销
def login_auth(func):
def inner(request, *args, **kwargs):
if request.user.is_authenticated():
return func(request, *args, **kwargs)
else:
return redirect('/app01/login/')
return inner
def log_in(request):
if request.is_ajax():
path = request.GET.get('getUrl')
if not path:
path = '/app01/books/'
data = json.loads(request.POST.get('data'))
username = data.get('user')
passwd = data.get('password')
user = auth.authenticate(username=username, password=passwd)
if user:
auth.login(request, user)
result = {'status': 0, 'path': path, "info": "{} 登录成功!!".format(user)}
else:
result = {'status': 1, "info": "账户或密码不正确!!"}
return HttpResponse(json.dumps(result))
else:
return render(request, 'Signin.html')
def login_out(request):
auth.logout(request)
return redirect('/app01/login/')
def register(request):
if request.is_ajax():
data = json.loads(request.POST.get('data'))
confirmPwd = data.pop('confirmPassword')
User.objects.create_user(**data)
redirect('/app01/login')
return render(request, 'register.html')
def change_password(request):
if request.is_ajax():
data = json.loads(request.POST.get('data'))
oldPassword = data.get('oldPassword')
newPassword = data.get('newPassword')
confirmPassword = data.get('confirmPassword')
if request.user.check_password(oldPassword):
request.user.set_password(newPassword)
request.user.save()
result = {'status': 0, "info": "密码修改登录成功!!"}
else:
result = {'status': 1, "info": "原密码不正确!!"}
return HttpResponse(json.dumps(result))
return render(request, 'changepassword.html')
オリジナルリンク:https://www.cnblogs.com/wangyuanming/p/8028623.html