microdot.login — käyttäjän kirjautumisvirta¶
Korkeamman tason kääre moduulin microdot.session ympärille, joka toteuttaa tavanomaisen käyttäjänimi/salasana-kirjautumisvirran: käyttäjän lataaja -takaisinkutsu yhdistää istuntoon tallennetun käyttäjätunnuksen takaisin sovelluksen käyttäjäobjektiin, reittidekoraattorit ohjaavat todentamattomat pyynnöt konfiguroitavaan kirjautumis-URL-osoitteeseen, ja valinnaiset ”muista minut” -evästeet antavat palaavien kävijöiden pysyä kirjautuneina selainistuntojen yli.
Vaatii, että microdot.session on alustettu sovelluksessa ennen kirjautumisobjektin rakentamista – käyttäjätunnus tallennetaan istuntoon.
class Login¶
- class microdot.login.Login(login_url: str = '/login')¶
- login_url
URL-osoite, johon dekoraattori ohjaa todentamattomat pyynnöt. Sovellus tarjoaa varsinaisen kirjautumislomakkeen/käsittelijän tässä reitissä. Oletus
'/login'.
- user_loader(f)¶
Dekoraattori, joka rekisteröi käyttäjän selvittävän takaisinkutsun. f ottaa istuntoon tallennetun käyttäjätunnuksen ja palauttaa käyttäjäobjektin (tai
None, jos tunnus ei ole enää kelvollinen – poistettu tili, peruutettu istunto tms.).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)¶
Reitin dekorointi
Login-instanssilla suojaa sen todennuksen taakse:@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
Todentamattomat pyynnöt ohjataan osoitteeseen login_url hakuparametrilla
?next=<original-url>, jotta kirjautumiskäsittelijä voi lähettää käyttäjän takaisin sinne, mistä hän tuli.
- fresh(f)¶
Kuten
__call__(), mutta hylkää ”muista minut” -evästeestä palautetut istunnot – käyttäjän on täytynyt kirjautua nimenomaisesti sisään edellisen täyden kirjautumisen jälkeen. Käytetään herkkien reittien (salasanan vaihto, tilin poisto) suojaamiseen, jotta varastettu muista minut -eväste ei pääse niihin käsiksi.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')¶
Merkitsee käyttäjän user kirjautuneeksi pyyntöä request varten. Tallentaa käyttäjätunnuksen istuntoon ja palauttaa uudelleenohjausvastauksen.
- user
Käyttäjän lataajan palauttama käyttäjäobjekti. Sillä on oltava
id-attribuutti.- remember
Jos tosi, asettaa myös pitkäikäisen
_remember-evästeen. AnnaTrueoletuksena olevia 30 päivää varten tai kokonaisluku evästeen kestopäivien määränä.- redirect_url
Minne ohjataan kirjautumisen jälkeen. Alkuperäisen pyynnön
?next=<url>ohittaa tämän, jos se osoittaa saman sivuston polkuun.
Palauttaa uudelleenohjausvastauksen – palauta sen arvo kirjautumisreitin käsittelijästä.
- async logout_user(request)¶
Tyhjentää käyttäjätunnuksen istunnosta ja poistaa mahdollisen
_remember-evästeen. Käytä/logout-reitistä:@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)¶
Palauttaa tällä hetkellä kirjautuneena olevan käyttäjäobjektin (tai
None). Muistitallennettu kohteeseenrequest.g.current_user, joten toistuvat kutsut yhden pyynnön sisällä osuvat lataajaan vain kerran.
Esimerkki¶
Minimaalinen kirjautumisvirta:
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('/')
_remember-eväste on itsessään allekirjoitettu JWT (istunnon salaisuutta käyttäen), joten varastettua evästettä ei voi käyttää uudelleen eri sovelluksessa tai sen jälkeen, kun salaisuus on vaihdettu.