Maison >développement back-end >Tutoriel Python >Authentification et autorisation des utilisateurs dans Flask

Authentification et autorisation des utilisateurs dans Flask

WBOY
WBOYoriginal
2023-06-17 18:02:052964parcourir

Avec l'utilisation généralisée des applications Web, la sécurité et la protection des données sont devenues un enjeu important dans le développement d'applications Web. Pour garantir la sécurité des applications Web, l'authentification et l'autorisation des utilisateurs sont requises. En tant que framework de développement Web populaire, Flask fournit de nombreux mécanismes pour implémenter l'authentification et l'autorisation des utilisateurs.

  1. Authentification utilisateur

L'authentification utilisateur fait référence à l'utilisation d'une certaine méthode d'authentification pour déterminer si l'identité de l'utilisateur est légitime lorsqu'il accède à une application Web. Flask fournit de nombreuses méthodes intégrées pour implémenter l'authentification des utilisateurs.

1.1. Authentification de base HTTP

L'authentification de base HTTP est un mécanisme d'authentification basé sur le protocole HTTP, qui oblige les utilisateurs à fournir un nom d'utilisateur et un mot de passe pour vérification lors de la demande de ressources. Flask dispose d'une fonction d'authentification de base HTTP intégrée, qui peut être facilement implémentée via l'extension Flask-BasicAuth.

Pour utiliser l'extension Flask-BasicAuth, vous devez installer et créer un objet BasicAuth dans l'application Flask, puis le décorer sur la fonction de routage qui nécessite une authentification de base. L'exemple de code est le suivant :

from flask import Flask
from flask_basicauth import BasicAuth

app = Flask(__name__)

app.config['BASIC_AUTH_USERNAME'] = 'username'
app.config['BASIC_AUTH_PASSWORD'] = 'password'

basic_auth = BasicAuth(app)

@app.route('/')
@basic_auth.required
def index():
    return 'Hello, World!'

Dans le code ci-dessus, les deux éléments de configuration de BasicAuth sont utilisés pour définir le nom d'utilisateur et le mot de passe. Le décorateur @basic_auth.required sur la fonction de routage implémente la fonction d'authentification de base.

1.2. Authentification par formulaire

L'authentification par formulaire est l'une des méthodes d'authentification les plus courantes dans les applications Web. La mise en œuvre de l'authentification par formulaire dans Flask nécessite généralement l'utilisation de l'extension Flask-Login.

L'extension Flask-Login fournit une classe UserMixin qui peut être utilisée pour représenter le modèle de données utilisateur. L'exemple de code est le suivant :

from flask_login import UserMixin

class User(UserMixin):
    def __init__(self, id, username, password):
        self.id = id
        self.username = username
        self.password = password

    def get_id(self):
        return str(self.id)

Dans l'exemple de code, la classe User hérite de la classe flask_login.UserMixin, qui contient les méthodes d'authentification utilisateur couramment utilisées. Dans l'extension Flask-Login, vous devez également fournir une fonction de chargement d'utilisateur pour charger les données utilisateur. L'exemple de code est le suivant :

from flask_login import login_user, LoginManager
from flask import Flask, render_template, redirect, url_for
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.secret_key = 'your secret key'

login_manager = LoginManager(app)

# 用户数据
users = {
    1: {'username': 'user1', 'password': 'password1'},
    2: {'username': 'user2', 'password': 'password2'},
    3: {'username': 'user3', 'password': 'password3'},
}

# 实现用户加载函数
@login_manager.user_loader
def load_user(user_id):
    user = users.get(int(user_id))
    if user:
        return User(user_id, user['username'], user['password'])
    return None

# 实现登录视图
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        for user_id, user_data in users.items():
            if user_data['username'] == username and check_password_hash(user_data['password'], password):
                user = User(user_id, username, password)
                login_user(user)
                return redirect(url_for('index'))
        return 'Invalid username/password combination'
    return render_template('login.html')

# 实现需要登录才能访问的视图
@app.route('/')
@login_required
def index():
    return 'Hello, World!'

Dans l'exemple de code, l'utilisation de l'extension Flask-Login nécessite l'initialisation de l'application Flask et la définition de secret_key, puis l'implémentation de la fonction de chargement de l'utilisateur via le décorateur login_manager.user_loader. Enfin, le contrôle de connexion peut être obtenu en utilisant le décorateur @login_required sur les fonctions d'affichage qui nécessitent une connexion pour accéder.

  1. Autorisation utilisateur

L'autorisation utilisateur consiste à déterminer quels utilisateurs peuvent accéder à quelles ressources. La mise en œuvre de l'autorisation utilisateur dans Flask nécessite l'utilisation de l'extension Flask-Principal.

L'extension Flask-Principal fournit trois classes : Autorisation, Rôle et Identité, qui peuvent être utilisées pour définir les autorisations des utilisateurs pour accéder aux ressources. L'autorisation représente l'autorisation de demander l'accès à une ressource, le rôle représente l'identité ou le groupe de l'utilisateur et l'identité représente les informations d'identité d'un utilisateur.

L'exemple de code est le suivant :

from flask_principal import Principal, Identity, AnonymousIdentity, Permission, RoleNeed

app = Flask(__name__)

principal = Principal(app)

# 定义角色,这里假设有管理员和普通用户两种角色
admin_role = RoleNeed('admin')
user_role = RoleNeed('user')

# 定义权限
admin_permission = Permission(admin_role)
user_permission = Permission(user_role)

# 定义 Identity,需要通过 Identity 的认证才能访问需要权限管理的路由
@app.before_request
def before_request():
    identity = Identity(anonymous=True)
    if current_user.is_authenticated:
        identity = Identity(current_user.id)
        if current_user.is_admin:
            identity.provides.add(admin_role)
        else:
            identity.provides.add(user_role)
    principal.identity = identity

# 在需要受权限控制的路由上使用 requires(permission) 装饰器
@app.route('/admin')
@admin_permission.require(http_exception=403)
def admin_index():
    return 'Hello, Admin!'

@app.route('/user')
@user_permission.require(http_exception=403)
def user_index():
    return 'Hello, User!'

Dans l'exemple de code, deux rôles sont définis, à savoir admin_role et user_role. Chaque rôle peut définir une autorisation, qui est utilisée pour contrôler les autorisations requises pour l'accès aux opérations associées. Dans la fonction before_request, l'authentification d'identité est implémentée et différents rôles sont ajoutés en fonction de la situation spécifique. Le contrôle des autorisations peut être obtenu en utilisant le décorateur require(permission) sur les routes qui nécessitent une gestion des autorisations.

Flask fournit de nombreuses méthodes pour mettre en œuvre l'authentification et l'autorisation des utilisateurs. La maîtrise de ces méthodes peut aider les développeurs à améliorer la sécurité des applications Web. Dans le même temps, les développeurs doivent également réfléchir attentivement à la méthode à utiliser pour mettre en œuvre l'authentification et l'autorisation des utilisateurs afin de garantir la sécurité des applications et la protection des données des utilisateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn