Flask でのユーザー認証と認可

WBOY
WBOYオリジナル
2023-06-17 18:02:052950ブラウズ

Web アプリケーションの普及に伴い、Web アプリケーション開発ではセキュリティとデータ保護が重要な問題となっています。 Web アプリケーションのセキュリティを確保するには、ユーザーの認証と認可が必要です。人気のある Web 開発フレームワークとして、Flask はユーザーの認証と認可を実装するための多くのメカニズムを提供します。

  1. ユーザー認証

ユーザー認証とは、ユーザーが Web アプリケーションにアクセスするときに、特定の認証方法を使用してユーザーの ID が正当であるかどうかを判断することを指します。 Flask には、ユーザー認証を実装するための多くの組み込みメソッドが用意されています。

1.1. HTTP 基本認証

HTTP 基本認証は HTTP プロトコルに基づく認証メカニズムであり、ユーザーはリソースをリクエストするときに検証のためにユーザー名とパスワードを入力する必要があります。 Flask には HTTP 基本認証機能が組み込まれており、Flask-BasicAuth 拡張機能を通じて簡単に実装できます。

Flask-BasicAuth 拡張機能を使用するには、Flask アプリケーションに BasicAuth オブジェクトをインストールして作成し、それを基本認証を必要とするルーティング関数に修飾する必要があります。サンプルコードは次のとおりです。

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!'

上記のコードでは、BasicAuth の 2 つの設定項目を使用してユーザー名とパスワードを設定しています。ルーティング関数の @basic_auth.required デコレーターは、基本認証関数を実装します。

1.2. フォーム認証

フォーム認証は、Web アプリケーションで最も一般的な認証方法の 1 つです。 Flask でフォーム認証を実装するには、通常、Flask-Login 拡張機能を使用する必要があります。

Flask-Login 拡張機能は、ユーザー データ モデルを表すために使用できる UserMixin クラスを提供します。サンプル コードは次のとおりです。

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)

サンプル コードでは、User クラスは、一般的に使用されるユーザー認証メソッドを含む flask_login.UserMixin クラスを継承します。 Flask-Login 拡張機能では、ユーザー データをロードするためのユーザー ロード関数も提供する必要があります。サンプル コードは次のとおりです。

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!'

サンプル コードでは、Flask-Login 拡張機能を使用するには、Flask アプリケーションを初期化して Secret_key を設定し、次に、login_manager.user_loader デコレータを介してユーザー ロード関数を実装する必要があります。最後に、ログイン制御は、アクセスにログインが必要なビュー関数で @login_required デコレータを使用することで実現できます。

  1. ユーザー承認

ユーザー承認とは、どのユーザーがどのリソースにアクセスできるかを決定することを指します。 Flask でユーザー認証を実装するには、Flask-Principal 拡張機能を使用する必要があります。

Flask-Principal 拡張機能は、Permission、Role、Identity の 3 つのクラスを提供し、リソースにアクセスするためのユーザー権限を定義するために使用できます。 Permission はリソースへのアクセスを要求する権限を表し、Role はユーザー ID またはグループを表し、Identity はユーザーの ID 情報を表します。

サンプル コードは次のとおりです。

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!'

サンプル コードでは、admin_role と user_role という 2 つのロールが定義されています。各役割は、関連する操作アクセスに必要な権限を制御するために使用される権限を定義できます。 before_request 関数では、Identity 認証が実装され、特定の状況に応じてさまざまなロールが追加されます。アクセス許可の制御は、アクセス許可の管理が必要なルートで require(permission) デコレータを使用することで実現できます。

Flask は、ユーザーの認証と認可を実装するためのメソッドを多数提供します。これらの方法を習得すると、開発者が Web アプリケーションのセキュリティを向上させることができます。同時に、開発者は、アプリケーションのセキュリティとユーザー データの保護を確保するために、ユーザーの認証と認可を実装するためにどの方法を使用するかを慎重に検討する必要もあります。

以上がFlask でのユーザー認証と認可の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。