Flaskで実装するユーザ認証と認可の完全ガイド

この記事では、PythonのWebフレームワークであるFlaskを用いたユーザ認証と認可の方法を詳しく解説します。具体的なコード例とその解説、応用例を含めています。

目次

はじめに

Webアプリケーションにおいて、ユーザ認証と認可は非常に重要な部分です。この二つの要素がしっかりと実装されていないと、不正アクセスやデータ漏洩のリスクが高まります。

基本的なユーザ認証

Flaskでは、`Flask-Login`という拡張を使用して基本的なユーザ認証を実装することが一般的です。

Flask-Loginのインストール

まずは、以下のコマンドで`Flask-Login`をインストールします。

pip install Flask-Login

基本的な認証のコード例

from flask import Flask, redirect, url_for, render_template
from flask_login import LoginManager, login_user, logout_user

# Flaskアプリの設定
app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)

# ユーザ認証
@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.get(request.form['username'])
        if user and user.check_password(request.form['password']):
            login_user(user)
            return redirect(url_for('index'))
    return render_template('login.html')
    
# 以下は省略

コードの詳細解説

– `from flask_login import LoginManager, login_user, logout_user`: Flask-Loginから必要なクラスとメソッドをインポートします。
– `login_manager = LoginManager()`: LoginManagerのインスタンスを作成します。
– `@login_manager.user_loader`: ユーザの情報をデータベースやその他の場所からロードするメソッドを定義します。
– `login_user(user)`: この関数でユーザをログイン状態にします。

認可

基本的な認可の実装

from flask_login import login_required

@app.route('/dashboard')
@login_required
def dashboard():
    return 'This is your dashboard'

コードの詳細解説

– `@login_required`: このデコレータは、ログインしていないとアクセスできないようにします。

応用例

1. ロールに基づいた認可

from functools import wraps

def role_required(role):
    @wraps
    def wrapper(func):
        @login_required
        def decorated_view(*args, **kwargs):
            if current_user.role != role:
                return "You don't have permission"
            return func(*args, **kwargs)
        return decorated_view
    return wrapper

@app.route('/admin')
@role_required('admin')
def admin():
    return 'This is the admin page'

2. 二要素認証の実装

from flask import session

@app.route('/2fa', methods=['GET', 'POST'])
@login_required
def two_factor_auth():
    if request.method == 'POST':
        if request.form['token'] == session['2fa_token']:
            return redirect(url_for('dashboard'))
    return render_template('2fa.html')

まとめ

Flaskでのユーザ認証と認可は、多くの機能と拡張性を持ちながらもシンプルに実装できます。今回紹介した基本的な方法から応用例まで、しっかりと学ぶことで、より安全なWebアプリケーションを開発することが可能です。

コメント

コメントする

目次