UserService.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using BCrypt.Net;
  2. using Model; // 确保添加了这行 using
  3. using System;
  4. using System.Data.SQLite;
  5. using StandardLibrary;
  6. public class UserService
  7. {
  8. // 注意:Users 表现在不需要单独的 Salt 列了!
  9. // Password 列应足够长(如 TEXT 或 VARCHAR(255)),因为 BCrypt 哈希很长。
  10. public static bool ValidateUser(User user,out string err)
  11. {
  12. using (var connection = new SQLiteConnection(DatabaseHelper.ConnectionString))
  13. {
  14. connection.Open();
  15. using (var command = new SQLiteCommand(
  16. "SELECT Id,PasswordHash,PermissionLevel,CanCloseSoftware FROM Users WHERE Username = @username",
  17. connection))
  18. {
  19. command.Parameters.AddWithValue("@username", user.Username);
  20. using (var reader = command.ExecuteReader())
  21. {
  22. if (reader.Read())
  23. {
  24. int id = reader.GetInt32(0);
  25. string storedHash = reader.GetString(1);
  26. int permissionLevel = reader.GetInt32(2);
  27. bool canClose = reader.GetBoolean(3);
  28. // 使用 BCrypt.Verify 进行验证
  29. if (BCrypt.Net.BCrypt.Verify(user.Password, storedHash))
  30. {
  31. user.Id = id;
  32. user.PermissionLevel = EnumExt.TryParseEnum<PermissionLevel>(permissionLevel, out PermissionLevel result)? result:PermissionLevel.无权限;
  33. user.Password = string.Empty;
  34. user.CanCloseSoftware = canClose;
  35. err = string.Empty;
  36. return true;
  37. }
  38. else
  39. {
  40. err = "密码错误";
  41. return false;
  42. }
  43. }
  44. }
  45. }
  46. }
  47. err = "用户不存在";
  48. return false;
  49. }
  50. public static bool RegisterUser(User user,out string err)//string username, string password, int permissionLevel
  51. {
  52. // 步骤 1:检查用户名是否已存在
  53. if (IsUsernameExists(user.Username))
  54. {
  55. // 用户名已存在,返回 false 表示注册失败
  56. err = "用户已存在";
  57. return false;
  58. }
  59. // 步骤 2:用户名不存在,可以安全注册
  60. string passwordHash = BCrypt.Net.BCrypt.HashPassword(user.Password);
  61. using (var connection = new SQLiteConnection(DatabaseHelper.ConnectionString))
  62. {
  63. connection.Open();
  64. using (var command = new SQLiteCommand(
  65. "INSERT INTO Users (Username, PasswordHash, PermissionLevel,CanCloseSoftware) VALUES (@username, @hash, @level,@canClose)",
  66. connection))
  67. {
  68. command.Parameters.AddWithValue("@username", user.Username);
  69. command.Parameters.AddWithValue("@hash", passwordHash);
  70. command.Parameters.AddWithValue("@level", user.PermissionLevel);
  71. command.Parameters.AddWithValue("@canClose", user.CanCloseSoftware);
  72. command.ExecuteNonQuery();
  73. }
  74. }
  75. // 注册成功
  76. err = string.Empty;
  77. return true;
  78. }
  79. // 辅助方法:检查用户名是否存在
  80. private static bool IsUsernameExists(string username)
  81. {
  82. using (var connection = new SQLiteConnection(DatabaseHelper.ConnectionString))
  83. {
  84. connection.Open();
  85. using (var command = new SQLiteCommand(
  86. "SELECT 1 FROM Users WHERE Username = @username", // SELECT 1 是个技巧,只关心是否存在
  87. connection))
  88. {
  89. command.Parameters.AddWithValue("@username", username);
  90. // ExecuteScalar() 返回第一行第一列的值,如果不存在则返回 null
  91. return command.ExecuteScalar() != null;
  92. }
  93. }
  94. }
  95. }