microdot.login --- Alur login pengguna¶
Pembungkus tingkat lebih tinggi di sekitar microdot.session yang mengimplementasikan alur login nama pengguna / kata sandi konvensional: callback user loader memetakan id-pengguna tersimpan dari sesi kembali ke objek pengguna aplikasi, dekorator rute mengalihkan permintaan yang tidak terautentikasi ke URL login yang dapat dikonfigurasi, dan cookie "ingat saya" opsional memungkinkan pengunjung yang kembali tetap masuk di seluruh sesi browser.
Membutuhkan microdot.session untuk diinisialisasi pada aplikasi sebelum objek login dibuat -- sesi adalah tempat id-pengguna disimpan.
class Login¶
- class microdot.login.Login(login_url: str = '/login')¶
- login_url
URL tempat dekorator mengalihkan permintaan yang tidak terautentikasi. Aplikasi menyediakan form/handler login yang sebenarnya di rute ini. Default
'/login'.
- user_loader(f)¶
Dekorator yang mendaftarkan callback pemecah-pengguna. f menerima id-pengguna yang tersimpan dalam sesi dan mengembalikan objek pengguna (atau
Nonejika id tidak lagi valid -- akun yang dihapus, sesi yang dicabut, dll.).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)¶
Mendekorasi rute dengan instans
Loginakan melindunginya di balik autentikasi:@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
Permintaan yang tidak terautentikasi dialihkan ke login_url dengan parameter kueri
?next=<original-url>agar handler login dapat mengirim pengguna kembali ke tempat mereka berasal.
- fresh(f)¶
Seperti
__call__(), tetapi menolak sesi yang dipulihkan dari cookie "ingat saya" -- pengguna harus telah login secara eksplisit sejak login penuh terakhir. Digunakan untuk melindungi rute sensitif (perubahan kata sandi, penghapusan akun) agar cookie ingat-saya yang dicuri tidak dapat menjangkaunya.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')¶
Tandai user sebagai sudah login untuk request. Menyimpan id pengguna dalam sesi dan mengembalikan respons pengalihan.
- user
Objek pengguna yang dikembalikan oleh user loader. Harus memiliki atribut
id.- remember
Jika bernilai benar, juga setel cookie
_rememberyang berumur panjang. BerikanTrueuntuk default 30 hari, atau bilangan bulat untuk jumlah hari cookie harus bertahan.- redirect_url
Ke mana harus dialihkan setelah login. Ditimpa oleh
?next=<url>dari permintaan asli jika menunjuk ke jalur situs yang sama.
Mengembalikan respons pengalihan -- kembalikan nilainya dari handler rute login.
- async logout_user(request)¶
Hapus id pengguna dari sesi dan hapus cookie
_rememberapa pun. Gunakan dari rute/logout@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)¶
Kembalikan objek pengguna yang sedang login (atau
None). Di-memo padarequest.g.current_usersehingga panggilan berulang dalam satu permintaan hanya menyentuh loader sekali.
Contoh¶
Alur login minimal:
from microdot import Microdot, redirect
from microdot.session import Session
from microdot.login import Login
app = Microdot()
Session(app, secret_key=load_secret())
login = Login()
@login.user_loader
async def load_user(user_id):
return users.get(user_id)
@app.get('/login')
async def login_page(request):
return Response.send_file('static/login.html')
@app.post('/login')
async def do_login(request):
user = authenticate(request.form['user'], request.form['pass'])
if not user:
return redirect('/login?error=1')
return await login.login_user(request, user, remember=True)
@app.get('/dashboard')
@login
async def dashboard(request):
return 'hi ' + request.g.current_user.name
@app.post('/logout')
async def logout(request):
await login.logout_user(request)
return redirect('/')
Cookie _remember itu sendiri adalah JWT yang ditandatangani (menggunakan rahasia sesi), sehingga cookie yang dicuri tidak dapat digunakan kembali pada aplikasi yang berbeda atau setelah rahasia dirotasi.