fix(settings): corregir desincronizacion de metodos de autenticacion, normalizar claves de proveedores y añadir badges reactivos de estado

This commit is contained in:
2026-09-23 17:52:45 -03:00
parent b20e206a76
commit 5771476ee9
5 changed files with 330 additions and 38 deletions
+62 -1
View File
@@ -1454,8 +1454,11 @@ def global_settings():
},
'auth_providers': {
'local': SystemSetting.get_value('auth_local_enabled', 'true') in ['true', 'True', '1', True],
'local_enabled': SystemSetting.get_value('auth_local_enabled', 'true') in ['true', 'True', '1', True],
'google': SystemSetting.get_value('auth_google_enabled', 'false') in ['true', 'True', '1', True],
'moodle': SystemSetting.get_value('auth_moodle_enabled', 'false') in ['true', 'True', '1', True]
'google_enabled': SystemSetting.get_value('auth_google_enabled', 'false') in ['true', 'True', '1', True],
'moodle': SystemSetting.get_value('auth_moodle_enabled', 'false') in ['true', 'True', '1', True],
'moodle_enabled': SystemSetting.get_value('auth_moodle_enabled', 'false') in ['true', 'True', '1', True]
},
'google_oauth': {
'client_id': SystemSetting.get_value('google_client_id', ''),
@@ -1555,3 +1558,61 @@ def toggle_demo_mode():
flash(_(msg_detail), 'success' if not target_state else 'info')
return redirect(url_for('admin.global_settings'))
@admin_bp.route('/settings/auth-providers', methods=['POST'])
@login_required
def update_auth_providers_web():
"""Actualiza los métodos de autenticación habilitados desde la interfaz de administración."""
if not (current_user.is_admin() or (current_user.role and current_user.role.upper() == 'ADMIN')):
if request.is_json or request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return jsonify({'status': 'error', 'message': 'Acción no autorizada'}), 403
abort(403)
from app.models.setting import SystemSetting
from app.models.audit_log import AuditLog
data = request.get_json(silent=True) or request.form.to_dict() or {}
local_input = data.get('local_enabled') if 'local_enabled' in data else data.get('local', True)
google_input = data.get('google_enabled') if 'google_enabled' in data else data.get('google', False)
moodle_input = data.get('moodle_enabled') if 'moodle_enabled' in data else data.get('moodle', False)
local_val = 'true' if local_input in [True, 'true', '1', 'on'] else 'false'
google_val = 'true' if google_input in [True, 'true', '1', 'on'] else 'false'
moodle_val = 'true' if moodle_input in [True, 'true', '1', 'on'] else 'false'
SystemSetting.set_value('auth_local_enabled', local_val, 'Habilitar login nativo con usuario/contraseña', category='sso')
SystemSetting.set_value('auth_google_enabled', google_val, 'Habilitar login SSO con Google Workspace', category='sso')
SystemSetting.set_value('auth_moodle_enabled', moodle_val, 'Habilitar login delegado con Moodle', category='sso')
try:
audit = AuditLog(
user_id=current_user.id,
user_email=current_user.email,
action='UPDATE_AUTH_PROVIDERS',
module='settings',
details=f"Métodos de login actualizados: Local={local_val}, Google={google_val}, Moodle={moodle_val}"
)
db.session.add(audit)
db.session.commit()
except Exception:
pass
resp_data = {
'status': 'success',
'message': 'Métodos de autenticación actualizados correctamente.',
'auth_providers': {
'local': local_val == 'true',
'local_enabled': local_val == 'true',
'google': google_val == 'true',
'google_enabled': google_val == 'true',
'moodle': moodle_val == 'true',
'moodle_enabled': moodle_val == 'true'
}
}
if request.is_json or request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return jsonify(resp_data), 200
flash(_('Métodos de autenticación actualizados correctamente.'), 'success')
return redirect(url_for('admin.global_settings'))