>백엔드 개발 >파이썬 튜토리얼 >Flask의 사용자 인증 및 승인

Flask의 사용자 인증 및 승인

WBOY
WBOY원래의
2023-06-17 18:02:052950검색

웹 애플리케이션의 광범위한 사용으로 인해 웹 애플리케이션 개발에서 보안 및 데이터 보호가 중요한 문제가 되었습니다. 웹 애플리케이션의 보안을 보장하려면 사용자 인증 및 권한 부여가 필요합니다. 널리 사용되는 웹 개발 프레임워크인 Flask는 사용자 인증 및 권한 부여를 구현하기 위한 다양한 메커니즘을 제공합니다.

  1. 사용자 인증

사용자 인증은 사용자가 웹 애플리케이션에 액세스할 때 사용자의 신원이 합법적인지 확인하기 위해 특정 인증 방법을 사용하는 것을 말합니다. 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의 두 가지 구성 항목을 사용하여 사용자 이름과 비밀번호를 설정합니다. 라우팅 기능의 @basic_auth.required 데코레이터는 기본 인증 기능을 구현합니다.

1.2. 양식 인증

양식 인증은 웹 애플리케이션에서 가장 일반적인 인증 방법 중 하나입니다. 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 클래스는 일반적으로 사용되는 사용자 인증 방법이 포함된 플라스크_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 확장은 리소스에 액세스하기 위한 사용자 권한을 정의하는 데 사용할 수 있는 권한, 역할 및 ID의 세 가지 클래스를 제공합니다. 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이라는 두 가지 역할이 정의되어 있습니다. 각 역할은 관련 작업 액세스에 필요한 권한을 제어하는 ​​데 사용되는 권한을 정의할 수 있습니다. before_request 함수에서는 신원 인증이 구현되며, 특정 상황에 따라 다양한 Role이 추가됩니다. 권한 관리가 필요한 경로에서는 require(permission) 데코레이터를 사용하여 권한 제어를 수행할 수 있습니다.

Flask는 사용자 인증 및 권한 부여를 구현하는 다양한 방법을 제공합니다. 이러한 방법을 익히면 개발자가 웹 애플리케이션의 보안을 향상하는 데 도움이 될 수 있습니다. 동시에 개발자는 애플리케이션 보안과 사용자 데이터 보호를 보장하기 위해 사용자 인증 및 권한 부여를 구현하는 데 사용할 방법을 신중하게 고려해야 합니다.

위 내용은 Flask의 사용자 인증 및 승인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.