You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Discord OAUTH2结合Flask/discord.py实现后台面板角色权限管控

使用Flask结合Discord OAuth2实现管理员权限管控

核心思路

通过Discord OAuth2授权时获取用户的服务器角色信息,在访问后台面板前验证用户是否拥有指定的管理员角色,直接拒绝无权限用户的访问请求。

步骤与代码实现

  1. 安装依赖
pip install flask flask-dance-discord
  1. Flask应用配置与权限验证逻辑
from flask import Flask, redirect, url_for, abort
from flask_dance.contrib.discord import make_discord_blueprint, discord
import os

app = Flask(__name__)
app.secret_key = os.environ.get("FLASK_SECRET_KEY", "your-custom-secret-key")

# 替换为你的Discord应用信息和服务器/角色ID
DISCORD_CLIENT_ID = os.environ.get("DISCORD_CLIENT_ID")
DISCORD_CLIENT_SECRET = os.environ.get("DISCORD_CLIENT_SECRET")
TARGET_GUILD_ID = 123456789012345678  # 你的目标服务器ID
ADMIN_ROLE_ID = 987654321098765432    # 管理员角色ID

# 初始化Discord OAuth2蓝图,请求必要权限
discord_bp = make_discord_blueprint(
    client_id=DISCORD_CLIENT_ID,
    client_secret=DISCORD_CLIENT_SECRET,
    scope=["identify", "guilds"],  # 必须包含guilds才能获取用户角色信息
    redirect_to="index"
)
app.register_blueprint(discord_bp, url_prefix="/login")

def has_admin_permission():
    if not discord.authorized:
        return False
    
    # 获取用户加入的服务器列表
    guilds_resp = discord.get("/users/@me/guilds")
    if guilds_resp.status_code != 200:
        return False
    
    # 检查用户是否在目标服务器,并验证角色
    for guild in guilds_resp.json():
        if guild["id"] == str(TARGET_GUILD_ID):
            member_resp = discord.get(f"/guilds/{TARGET_GUILD_ID}/members/{discord.token['user_id']}")
            if member_resp.status_code == 200:
                member_data = member_resp.json()
                return str(ADMIN_ROLE_ID) in member_data["roles"]
    return False

# 普通首页路由
@app.route("/")
def index():
    if not discord.authorized:
        return redirect(url_for("discord.login"))
    return "欢迎访问首页"

# 后台面板路由,仅管理员可访问
@app.route("/admin")
def admin_panel():
    if not has_admin_permission():
        abort(403)  # 返回403禁止访问
    return "管理员后台面板"

if __name__ == "__main__":
    app.run(debug=True)

关键注意事项

  • 权限配置:在Discord开发者门户的OAuth2设置中,需为应用添加guilds.members.read权限,否则无法获取用户在服务器内的角色信息。
  • 角色ID验证:优先使用角色ID而非名称进行验证,避免因角色名称修改导致权限判断失效。
  • 自定义错误页:可替换abort(403)为自定义页面跳转,提升无权限用户的体验。

内容的提问来源于stack exchange,提问作者Mikey K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:05:08