flask-login J'ai implémenté une fonction de connexion en utilisant flask-login, mais je voulais connaître le mécanisme interne, alors j'ai étudié le mécanisme à partir de la documentation et du code source!
Vous pouvez étendre la classe UserMixin.
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
@login_manager.user_loader
def load_user(userid):
return User(userid)
L'argument reçu par load_user ici est la valeur renvoyée par get_id () définie dans la classe User. Si nécessaire, laissez get_id () retourner la valeur nécessaire pour extraire l'utilisateur de la base de données: smile:
def login():
form = LoginForm()
if form.validate_on_submit():
login_user(user)
flask.flash('Logged in successfully.')
next = flask.request.args.get('next')
if not is_safe_url(next):
return flask.abort(400)
return flask.redirect(next or flask.url_for('index'))
return flask.render_template('login.html', form=form)
Passez l'utilisateur à login_user et flask-login fera le reste. Il stocke principalement les informations nécessaires pour maintenir l'état de connexion dans la session, met à jour l'utilisateur du contexte de la requête, envoie un signal de connexion, etc.: arc:
@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(somewhere)
C'est très simple, il suffit d'appeler logout_user. Dans la fonction logout_user, l'utilisateur connecté est récupéré et le processus de déconnexion est exécuté, il n'est donc pas nécessaire de passer l'utilisateur. En gros, c'est l'opposé de la connexion. Pour conserver l'état de connexion, supprimez la valeur conservée dans la session, mettez à jour l'utilisateur dans le contexte de la demande en anonymous_user et envoyez le signal de déconnexion. : Rolling_eyes:
Dans le décorateur login_required, récupérez le current_user. current_user tente d'obtenir l'utilisateur à partir des informations stockées dans la session (en particulier user_id). [une] Puisqu'il est avant la connexion, la session n'a pas user_id, donc l'obtention de l'utilisateur échoue. Si request_loader est défini, utilisez-les pour essayer de vous connecter. Puisque request_loader n'est pas défini cette fois, current_user sera un utilisateur anonyme. Puisque is_authenticated, qui est défini dans la classe Utilisateur anonyme, retourne False, il est déterminé qu'il n'est pas authentifié, et LoginManger's unauthorized () est appelé pour rediriger vers l'écran de connexion.
C'est la même chose que [a] du comportement avant la connexion. Si l'utilisateur est acquis avec succès, l'utilisateur est renvoyé tel quel. Vérifiez si l'utilisateur est authentifié avec is_authenticated. Puisqu'il ne s'agit pas d'un utilisateur anonyme, il renvoie True comme défini dans le modèle User. Puisqu'il est déterminé à être authentifié, le traitement suivant se poursuivra: rire:
Attribut --HttpOnly Par défaut, Flask contient les informations de session côté client, appelées session basée sur les cookies. Par conséquent, définissez SESSION_COOKIE_HTTPONLY sur True pour empêcher JavaScript d'accéder à ces informations. (La valeur par défaut est True) [1]
Transmission limitée des cookies de session basée sur les cookies vers Https uniquement Définissons SESSION_COOKIE_SECURE sur True. (La valeur par défaut est False) [2]
Protection de session Étant donné que flask-login génère une valeur de hachage à partir de l'adresse IP et de l'agent utilisateur et la conserve dans la session, si cette valeur change par rapport à l'heure précédente, le comportement du mode de base par défaut rejettera l'état de connexion. Cependant, du côté du flacon, si le paramètre de persistance de session est défini, l'état de connexion sera conservé, mais cette session sera marquée comme non fraîche. En mode fort, l'état de connexion est ignoré si le hachage a changé.
By default, it is activated in "basic" mode. It can be disabled in the app’s configuration by setting the SESSION_PROTECTION setting to None, "basic", or "strong". When session protection is active, each request, it generates an identifier for the user’s computer (basically, a secure hash of the IP address and user agent). If the session does not have an associated identifier, the one generated will be stored. If it has an identifier, and it matches the one generated, then the request is OK. If the identifiers do not match in basic mode, or when the session is permanent, then the session will simply be marked as non-fresh, and anything requiring a fresh login will force the user to re-authenticate. (Of course, you must be already using fresh logins where appropriate for this to have an effect.) If the identifiers do not match in strong mode for a non-permanent session, then the entire session (as well as the remember token if it exists) is deleted. [3]
[1] https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_HTTPONLY [2] https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_SECURE [2] https://flask-login.readthedocs.io/en/latest/#session-protection
Recommended Posts