本方案基于Python3.8+、Flask框架及MySQL数据库实现,全程零额外服务依赖,直接上手。
执行以下命令安装所需库:
``` pip install flask flask-sqlalchemy pymysql ```若未安装Python3.8,Windows用户访问https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe 下载安装,勾选“Add Python to PATH”;Mac用户执行brew install python@3.8;Linux用户执行apt install python3.8。
仅需1个文件(app.py)完成所有逻辑,无需复杂目录,降低上手门槛。
在MySQL中执行以下建表语句,无需手动创建库,语句会自动生成表结构:
``` CREATE DATABASE IF NOT EXISTS archive_auth; USE archive_auth; CREATE TABLE IF NOT EXISTS roles ( role_id INT AUTO_INCREMENT PRIMARY KEY, role_name VARCHAR(50) NOT NULL UNIQUE, permissions JSON NOT NULL COMMENT '存储权限列表,如["view_archive","edit_archive"]' ); CREATE TABLE IF NOT EXISTS users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role_id INT NOT NULL, FOREIGN KEY (role_id) REFERENCES roles(role_id) ); CREATE TABLE IF NOT EXISTS archives ( archive_id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, content TEXT, creator_id INT NOT NULL, FOREIGN KEY (creator_id) REFERENCES users(user_id) ); ```执行方式:打开MySQL终端,输入密码后直接粘贴上述代码,回车完成建表。
新建app.py文件,写入以下内容:
``` from flask import Flask, request, jsonify, g from flask_sqlalchemy import SQLAlchemy import json app = Flask(__name__) 替换为你的MySQL用户名和密码,默认root/root可直接使用 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/archive_auth' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) ```重点操作:将连接字符串中的root:root替换为你实际的MySQL登录密码,不可省略。

在app.py中追加以下代码,定义数据库映射:
``` class Role(db.Model): role_id = db.Column(db.Integer, primary_key=True) role_name = db.Column(db.String(50), unique=True, nullable=False) permissions = db.Column(db.JSON, nullable=False) class User(db.Model): user_id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(100), nullable=False) role_id = db.Column(db.Integer, db.ForeignKey('role.role_id'), nullable=False) class Archive(db.Model): archive_id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text) creator_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), nullable=False) ```追加权限装饰器,用于拦截无权限操作:
``` def require_permission(permission): def decorator(f): def wrapper(args, kwargs): 实际项目中需替换为Session/Token获取的当前用户ID,此处用模拟ID演示 current_user_id = 1 user = User.query.get(current_user_id) role = Role.query.get(user.role_id) if permission not in role.permissions: return jsonify({"code": 403, "msg": "无操作权限"}), 403 return f(args, kwargs) wrapper.__name__ = f.__name__ return wrapper return decorator ```追加档案管理相关路由:
``` 创建角色接口 @app.route('/create_role', methods=['POST']) def create_role(): data = request.get_json() if Role.query.filter_by(role_name=data['role_name']).first(): return jsonify({"code": 400, "msg": "角色名已存在"}) new_role = Role( role_name=data['role_name'], permissions=json.dumps(data['permissions']) ) db.session.add(new_role) db.session.commit() return jsonify({"code": 200, "msg": "角色创建成功"}) 创建档案接口(需edit_archive权限) @app.route('/create_archive', methods=['POST']) @require_permission('edit_archive') def create_archive(): data = request.get_json() new_archive = Archive( title=data['title'], content=data['content'], creator_id=1 ) db.session.add(new_archive) db.session.commit() return jsonify({"code": 200, "msg": "档案创建成功"}) 获取档案接口(需view_archive权限) @app.route('/get_archive/执行命令启动项目:python app.py,控制台输出“Running on http://127.0.0.1:5000/”即启动成功。
打开终端,执行以下curl命令创建管理员角色(拥有全部权限):
``` curl -X POST http://127.0.0.1:5000/create_role \ -H "Content-Type: application/json" \ -d '{"role_name":"admin","permissions":["view_archive","edit_archive","delete_archive"]}' ```执行普通用户角色创建命令:
``` curl -X POST http://127.0.0.1:5000/create_role \ -H "Content-Type: application/json" \ -d '{"role_name":"normal_user","permissions":["view_archive"]}' ```1. 管理员权限测试:执行以下命令创建档案,返回200则权限生效:
``` curl -X POST http://127.0.0.1:5000/create_archive \ -H "Content-Type: application/json" \ -d '{"title":"测试档案1","content":"测试内容"}' ```2. 普通用户权限测试:将权限装饰器中current_user_id修改为2,重新运行项目,再次执行创建档案命令,返回403则权限拦截生效。
1. 实际项目中,需将current_user_id替换为登录态(Token/Session)的用户标识,避免硬编码;2. 新增权限时,仅需在角色创建接口的permissions数组中添加权限名,对应路由添加@require_permission('新权限名')即可;3. 数据库可替换为PostgreSQL,仅需修改SQLALCHEMY_DATABASE_URI的协议为postgresql://格式,适配对应驱动即可。