处理后台跳转错误

This commit is contained in:
super
2026-04-22 01:09:47 +08:00
parent 236b73755c
commit 8c4a6cd12a
9 changed files with 45 additions and 29 deletions

View File

@@ -12,8 +12,8 @@ zn_username=%E8%87%AA%E5%8A%A8%E5%8C%96_Robot
client_name=ShuFuAI client_name=ShuFuAI
java_api_base=http://47.111.163.154:18080 # java_api_base=http://47.111.163.154:18080
# java_api_base=http://127.0.0.1:18080 # java_api_base=http://127.0.0.1:18080
# java_api_base=http://8.136.19.173:18080 java_api_base=http://8.136.19.173:18080

View File

@@ -5,7 +5,7 @@ from flask import Blueprint, request, redirect, url_for, session, jsonify
from werkzeug.security import check_password_hash from werkzeug.security import check_password_hash
from utils.db import get_db from utils.db import get_db
from utils.auth import login_required, is_session_user_valid from utils.auth import login_required, is_session_user_valid, is_current_user_admin
from utils.render import render_html from utils.render import render_html
auth = Blueprint('auth', __name__, url_prefix='') auth = Blueprint('auth', __name__, url_prefix='')
@@ -13,7 +13,7 @@ auth = Blueprint('auth', __name__, url_prefix='')
@auth.route('/login', methods=['GET', 'POST']) @auth.route('/login', methods=['GET', 'POST'])
def login(): def login():
if session.get('user_id') and is_session_user_valid(): if session.get('user_id') and is_session_user_valid() and is_current_user_admin():
return redirect(url_for('main.admin_page')) return redirect(url_for('main.admin_page'))
if request.method == 'POST': if request.method == 'POST':
data = request.get_json() if request.is_json else request.form data = request.get_json() if request.is_json else request.form
@@ -35,6 +35,11 @@ def login():
session.permanent = True session.permanent = True
session['user_id'] = row['id'] session['user_id'] = row['id']
session['username'] = username session['username'] = username
if not row.get('is_admin'):
session.clear()
if request.is_json:
return jsonify({'success': False, 'error': '需要管理员权限'}), 403
return render_html('login.html', error='需要管理员权限')
if request.is_json: if request.is_json:
return jsonify({'success': True, 'redirect': url_for('main.admin_page')}) return jsonify({'success': True, 'redirect': url_for('main.admin_page')})
return redirect(url_for('main.admin_page')) return redirect(url_for('main.admin_page'))
@@ -61,7 +66,7 @@ def api_auth_check():
cur.execute("SELECT machine, is_admin FROM users WHERE id = %s", (session['user_id'],)) cur.execute("SELECT machine, is_admin FROM users WHERE id = %s", (session['user_id'],))
row = cur.fetchone() row = cur.fetchone()
conn.close() conn.close()
if not row: if not row or not row.get('is_admin'):
return jsonify({'logged_in': False}) return jsonify({'logged_in': False})
except Exception: except Exception:
return jsonify({'logged_in': False}) return jsonify({'logged_in': False})

View File

@@ -4,7 +4,7 @@
import os import os
from flask import Blueprint, redirect, url_for, send_file, session from flask import Blueprint, redirect, url_for, send_file, session
from utils.auth import login_required, admin_required, is_session_user_valid from utils.auth import login_required, admin_required, is_session_user_valid, is_current_user_admin
from utils.render import render_html from utils.render import render_html
main = Blueprint('main', __name__, url_prefix='') main = Blueprint('main', __name__, url_prefix='')
@@ -15,7 +15,7 @@ STATIC_DIR = os.path.join(BASE_DIR, 'static')
@main.route('/') @main.route('/')
def index(): def index():
if session.get('user_id') and is_session_user_valid(): if session.get('user_id') and is_session_user_valid() and is_current_user_admin():
return redirect(url_for('main.admin_page')) return redirect(url_for('main.admin_page'))
return redirect(url_for('auth.login')) return redirect(url_for('auth.login'))

View File

@@ -23,8 +23,8 @@ bucket_path = "nanri-image/"
file_url_pre = f"https://{bucket}.oss-cn-hangzhou.aliyuncs.com/" file_url_pre = f"https://{bucket}.oss-cn-hangzhou.aliyuncs.com/"
import os import os
backend_java_base_url = os.environ.get('BACKEND_JAVA_BASE_URL', 'http://127.0.0.1:18080').rstrip('/') # backend_java_base_url = os.environ.get('BACKEND_JAVA_BASE_URL', 'http://127.0.0.1:18080').rstrip('/')
# backend_java_base_url = os.environ.get('BACKEND_JAVA_BASE_URL', 'http://8.136.19.173:18080').rstrip('/') backend_java_base_url = os.environ.get('BACKEND_JAVA_BASE_URL', 'http://8.136.19.173:18080').rstrip('/')
os.environ['OSS_ACCESS_KEY_ID'] = accessKeyId os.environ['OSS_ACCESS_KEY_ID'] = accessKeyId
os.environ['OSS_ACCESS_KEY_SECRET'] = accessKeySecret os.environ['OSS_ACCESS_KEY_SECRET'] = accessKeySecret
os.environ['SECRET_KEY'] = "ddffc7c1d02121d9554d7b080b2511b6" os.environ['SECRET_KEY'] = "ddffc7c1d02121d9554d7b080b2511b6"

View File

@@ -2,13 +2,14 @@
认证装饰器与 session 校验 认证装饰器与 session 校验
""" """
from functools import wraps from functools import wraps
from flask import request, redirect, url_for, session, jsonify from flask import request, redirect, url_for, session, jsonify
from utils.db import get_db from utils.db import get_db
def is_session_user_valid(): def is_session_user_valid():
"""校验 session 中的 user_id 是否在数据库中仍存在;不存在则清 session 并返回 False""" """校验 session 中的 user_id 是否仍存在;不存在则清 session"""
uid = session.get('user_id') uid = session.get('user_id')
if not uid: if not uid:
return False return False
@@ -28,28 +29,41 @@ def is_session_user_valid():
def get_current_admin_role(): def get_current_admin_role():
"""获取当前登录用户的管理角色super_admin / admin / None(非管理员)""" """返回当前登录用户的管理角色super_admin / admin / None"""
uid = session.get('user_id')
if not uid:
return None, None
try: try:
conn = get_db() conn = get_db()
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute( cur.execute(
"SELECT id, username, is_admin, role, created_by_id FROM users WHERE id = %s", "SELECT id, username, is_admin, role, created_by_id FROM users WHERE id = %s",
(session['user_id'],) (uid,)
) )
row = cur.fetchone() row = cur.fetchone()
conn.close() conn.close()
if not row or not row.get('is_admin'): if not row or not row.get('is_admin'):
return None, None return None, row
return row.get('role') or ('super_admin' if row.get('created_by_id') is None else 'admin'), row role = row.get('role') or ('super_admin' if row.get('created_by_id') is None else 'admin')
return role, row
except Exception: except Exception:
return None, None return None, None
def is_current_user_admin():
role, _ = get_current_admin_role()
return role in ('super_admin', 'admin')
def _is_ajax_request():
return request.headers.get('X-Requested-With') == 'XMLHttpRequest'
def login_required(f): def login_required(f):
@wraps(f) @wraps(f)
def decorated(*args, **kwargs): def decorated(*args, **kwargs):
if not session.get('user_id') or not is_session_user_valid(): if not session.get('user_id') or not is_session_user_valid():
if request.headers.get('X-Requested-With') == 'XMLHttpRequest': if _is_ajax_request():
return jsonify({'success': False, 'error': '未登录'}), 401 return jsonify({'success': False, 'error': '未登录'}), 401
return redirect(url_for('auth.login')) return redirect(url_for('auth.login'))
return f(*args, **kwargs) return f(*args, **kwargs)
@@ -59,23 +73,20 @@ def login_required(f):
def admin_required(f): def admin_required(f):
@wraps(f) @wraps(f)
def decorated(*args, **kwargs): def decorated(*args, **kwargs):
if not session.get('user_id'): if not session.get('user_id') or not is_session_user_valid():
if request.headers.get('X-Requested-With') == 'XMLHttpRequest': if _is_ajax_request():
return jsonify({'success': False, 'error': '未登录'}), 401 return jsonify({'success': False, 'error': '未登录'}), 401
return redirect(url_for('auth.login')) return redirect(url_for('auth.login'))
try: try:
conn = get_db() role, _ = get_current_admin_role()
with conn.cursor() as cur: if role not in ('super_admin', 'admin'):
cur.execute("SELECT is_admin, role FROM users WHERE id = %s", (session['user_id'],)) if _is_ajax_request():
row = cur.fetchone()
conn.close()
if not row or not row.get('is_admin'):
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return jsonify({'success': False, 'error': '需要管理员权限'}), 403 return jsonify({'success': False, 'error': '需要管理员权限'}), 403
return redirect(url_for('main.admin_page')) return redirect(url_for('auth.login'))
except Exception as e: except Exception as exc:
if request.headers.get('X-Requested-With') == 'XMLHttpRequest': if _is_ajax_request():
return jsonify({'success': False, 'error': str(e)}), 500 return jsonify({'success': False, 'error': str(exc)}), 500
return redirect(url_for('main.admin_page')) return redirect(url_for('auth.login'))
return f(*args, **kwargs) return f(*args, **kwargs)
return decorated return decorated