Flask用户认证和授权(三)

2023-05-06 15:28:00 浏览数 (1)

接下来,我们可以定义一个检查用户是否具有某个权限的函数:

代码语言:javascript复制
from flask_principal import Identity, AnonymousIdentity, identity_changed

def check_permission(permission):
    if current_user.is_authenticated:
        user_permissions = Permission.query.join(UserRole, RolePermission.role_id == UserRole.role_id)
            .filter(UserRole.user_id == current_user.id).all()
        for p in user_permissions:
            if p.name == permission:
                return True
    return False

在这个函数中,我们首先检查当前用户是否已登录。如果是,我们查询该用户拥有的所有权限,并检查用户是否具有所需的权限。如果用户具有该权限,我们将返回True。否则,我们将返回False。

现在,我们可以使用Flask-Principal提供的Permission装饰器来保护需要特定权限的视图函数:

代码语言:javascript复制
admin_permission = Permission(name='admin')

@app.route('/admin')
@admin_permission.require(http_exception=403)
@login_required
def admin():
    if not check_permission('admin'):
        abort(403)
    return render_template('admin.html')

在这个例子中,我们使用admin_permission.require()装饰器来限制只有具有“admin”权限的用户才能访问/admin路由。我们还使用http_exception=403参数来指定如果用户没有权限,则返回一个403错误。最后,我们还使用@login_required装饰器来确保用户已登录。

为了让Flask-Principal知道当前用户的身份和权限,我们需要使用identity_changed函数将当前用户的身份写入Flask-Principal的上下文中。例如,在用户登录后,我们可以使用以下代码:

代码语言:javascript复制
@bp.route('/login', methods=['GET', 'POST'])
def login():
    # ...
    if form.validate_on_submit():
        # ...
        identity = Identity(user.id)
        for role in user.roles:
            identity.provides.add(RoleNeed(role.name))
            for permission in role.permissions:
                identity.provides.add(ActionNeed(permission.name))
        identity_changed.send(current_app._get_current_object(), identity=identity)
        # ...

在这个例子中,我们首先创建一个Identity对象,然后将用户的ID添加到Identity对象中。然后,我们遍历用户的角色和权限,并使用RoleNeed和ActionNeed对象将它们添加到Identity对象中。最后,我们使用identity_changed函数将当前用户的身份写入Flask-Principal的上下文中。

0 人点赞