132 lines
3.8 KiB
JavaScript
132 lines
3.8 KiB
JavaScript
const { User, Role } = require('./models');
|
||
const bcrypt = require('bcryptjs');
|
||
|
||
async function debugAuthDetailed() {
|
||
try {
|
||
console.log('=== 详细调试认证逻辑 ===\n');
|
||
|
||
// 1. 检查数据库连接
|
||
console.log('1. 检查数据库连接...');
|
||
const user = await User.findOne({ where: { username: 'admin' } });
|
||
if (!user) {
|
||
console.log('❌ 未找到admin用户');
|
||
return;
|
||
}
|
||
console.log('✅ 数据库连接正常,找到admin用户\n');
|
||
|
||
// 2. 检查用户基本信息
|
||
console.log('2. 检查用户基本信息...');
|
||
console.log('用户名:', user.username);
|
||
console.log('状态:', user.status);
|
||
console.log('登录尝试次数:', user.login_attempts);
|
||
console.log('锁定时间:', user.locked_until);
|
||
console.log('密码哈希:', user.password);
|
||
console.log('');
|
||
|
||
// 3. 检查用户角色关联
|
||
console.log('3. 检查用户角色关联...');
|
||
const userWithRole = await User.findOne({
|
||
where: { username: 'admin' },
|
||
include: [{
|
||
model: Role,
|
||
as: 'role'
|
||
}]
|
||
});
|
||
|
||
if (userWithRole) {
|
||
console.log('✅ 用户角色关联正常');
|
||
console.log('角色:', userWithRole.role ? userWithRole.role.name : '无角色');
|
||
} else {
|
||
console.log('❌ 用户角色关联失败');
|
||
}
|
||
console.log('');
|
||
|
||
// 4. 测试密码验证
|
||
console.log('4. 测试密码验证...');
|
||
const testPassword = 'Admin123456';
|
||
console.log('测试密码:', testPassword);
|
||
|
||
// 直接使用bcrypt比较
|
||
const directTest = await bcrypt.compare(testPassword, user.password);
|
||
console.log('直接bcrypt验证:', directTest);
|
||
|
||
// 使用模型方法验证
|
||
const modelTest = await user.validPassword(testPassword);
|
||
console.log('模型验证:', modelTest);
|
||
|
||
if (!directTest) {
|
||
console.log('❌ 密码不匹配,重新生成密码...');
|
||
const newHash = await bcrypt.hash(testPassword, 10);
|
||
console.log('新哈希:', newHash);
|
||
|
||
await user.update({
|
||
password: newHash,
|
||
status: 'active',
|
||
login_attempts: 0,
|
||
locked_until: null
|
||
});
|
||
|
||
console.log('✅ 密码已更新');
|
||
|
||
// 重新加载用户数据
|
||
await user.reload();
|
||
|
||
// 再次验证
|
||
const finalTest = await bcrypt.compare(testPassword, user.password);
|
||
console.log('最终验证:', finalTest);
|
||
|
||
if (finalTest) {
|
||
console.log('🎉 密码修复成功!');
|
||
} else {
|
||
console.log('❌ 密码修复失败');
|
||
}
|
||
} else {
|
||
console.log('✅ 密码验证成功');
|
||
}
|
||
console.log('');
|
||
|
||
// 5. 模拟完整的登录流程
|
||
console.log('5. 模拟完整的登录流程...');
|
||
const loginUser = await User.findOne({
|
||
where: { username: 'admin' },
|
||
include: [{
|
||
model: Role,
|
||
as: 'role'
|
||
}]
|
||
});
|
||
|
||
if (loginUser) {
|
||
console.log('✅ 用户查找成功');
|
||
console.log('用户状态:', loginUser.status);
|
||
|
||
if (loginUser.status !== 'active') {
|
||
console.log('❌ 用户状态不是active:', loginUser.status);
|
||
} else {
|
||
console.log('✅ 用户状态正常');
|
||
}
|
||
|
||
const passwordValid = await loginUser.validPassword(testPassword);
|
||
console.log('密码验证结果:', passwordValid);
|
||
|
||
if (passwordValid) {
|
||
console.log('🎉 完整登录流程验证成功!');
|
||
console.log('用户名: admin');
|
||
console.log('密码: Admin123456');
|
||
console.log('状态: active');
|
||
} else {
|
||
console.log('❌ 密码验证失败');
|
||
}
|
||
} else {
|
||
console.log('❌ 用户查找失败');
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('调试失败:', error.message);
|
||
console.error('错误堆栈:', error.stack);
|
||
}
|
||
|
||
process.exit(0);
|
||
}
|
||
|
||
debugAuthDetailed();
|