UserHelper.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Diagnostics;
  6. using JLHHJSvr.Com.Model;
  7. using JLHHJSvr.DBA.DBModle;
  8. using LJLib.DAL.SQL;
  9. using LJLib.Tools.DEncrypt;
  10. using JLHHJSvr.LJException;
  11. using System.Linq;
  12. using DirectService.Tools;
  13. namespace JLHHJSvr.BLL
  14. {
  15. internal sealed class UserHelper
  16. {
  17. private static Dictionary<string, TokenData> _tokens = new Dictionary<string, TokenData>();
  18. ///// <summary>
  19. ///// TODO: 保存Token信息, 登录成功后绑定token与tokendata
  20. ///// </summary>
  21. ///// <param name="token"></param>
  22. ///// <param name="tokendata"></param>
  23. //public static void SetToken(string token, TokenData tokendata)
  24. //{
  25. // _tokens[token] = tokendata;
  26. //}
  27. ///// <summary>
  28. ///// TODO: 带token请求是通过本方法获取tokendata
  29. ///// </summary>
  30. ///// <param name="token"></param>
  31. ///// <returns>tokendata</returns>
  32. //public static TokenData GetToken(string token)
  33. //{
  34. // if (_tokens.ContainsKey(token))
  35. // {
  36. // return _tokens[token];
  37. // }
  38. // else
  39. // {
  40. // return null;
  41. // }
  42. //}
  43. ///// <summary>
  44. ///// TODO: 获取ID
  45. ///// </summary>
  46. ///// <param name="cmd">数据库连接,事务</param>
  47. ///// <param name="key">关联字</param>
  48. ///// <param name="step">增幅,默认1</param>
  49. ///// <returns>新ID上限</returns>
  50. //public static int GetID(SqlCommand cmd, string key, int step = 1)
  51. //{
  52. // int rslt = 0;
  53. // cmd.CommandText = "UPDATE cd_idfactory SET idvalue = idvalue + @step, @curid = idvalue + @step WHERE idkey = @idkey";
  54. // cmd.Parameters.Clear();
  55. // cmd.Parameters.Add("@idkey", SqlDbType.VarChar).Value = key;
  56. // cmd.Parameters.Add("@step", SqlDbType.Int).Value = step;
  57. // cmd.Parameters.Add("@curid", SqlDbType.Int).Direction = ParameterDirection.Output;
  58. // int nrows = cmd.ExecuteNonQuery();
  59. // if (nrows == 0)
  60. // {
  61. // rslt = 10 + step;
  62. // cmd.CommandText = "INSERT INTO cd_idfactory(idkey, idvalue) VALUES(@idkey, @curid)";
  63. // cmd.Parameters.Clear();
  64. // cmd.Parameters.Add("@idkey", SqlDbType.VarChar).Value = key;
  65. // cmd.Parameters.Add("@curid", SqlDbType.Int).Value = rslt;
  66. // cmd.ExecuteNonQuery();
  67. // }
  68. // else
  69. // {
  70. // rslt = Convert.ToInt32(cmd.Parameters["@curid"].Value);
  71. // }
  72. // return rslt;
  73. //}
  74. ///// <summary>
  75. ///// 初始化超级用户
  76. ///// </summary>
  77. ///// <param name="constr">数居库连接字符串</param>
  78. //public static void InitUser(string constr)
  79. //{
  80. // using (var con = new SqlConnection(constr))
  81. // using (var cmd = con.CreateCommand())
  82. // {
  83. // con.Open();
  84. // using (cmd.Transaction = con.BeginTransaction())
  85. // {
  86. // try
  87. // {
  88. // var user = new st_user {userid = 11};
  89. // if (DbSqlHelper.SelectOne(cmd, user, "usercode") != 1)
  90. // {
  91. // var id = GetID(cmd, "st_user");
  92. // user.userid = id;
  93. // user.usercode = "super";
  94. // user.username = "超级用户";
  95. // user.psw = DESEncrypt.Encrypt("super", "BC493812B6664BECBF44C21C3BB043C4");
  96. // user.sex = "男";
  97. // user.tel = string.Empty;
  98. // user.dscrp = string.Empty;
  99. // user.opemp = "初始化生成";
  100. // user.opdate = DateTime.Now;
  101. // user.modemp = "初始化生成";
  102. // user.moddate = DateTime.Now;
  103. // DbSqlHelper.InsertOrUpdate(cmd, user, "userid,usercode,username,psw,sex,tel,dscrp,opemp,opdate,modemp,moddate");
  104. // var powers = new Power().GetAllPowers();
  105. // var userPower = new st_user_power { userid = user.userid };
  106. // foreach (var power in powers)
  107. // {
  108. // userPower.funid = power.funid;
  109. // DbSqlHelper.Insert(cmd, userPower, "userid, funid");
  110. // }
  111. // }
  112. // cmd.Transaction.Commit();
  113. // }
  114. // catch (Exception e)
  115. // {
  116. // cmd.Transaction.Rollback();
  117. // Trace.Write("初始化super用户数据失败:"+e.ToString());
  118. // }
  119. // }
  120. // }
  121. //}
  122. public static bool CheckFuncPower(SqlCommand cmd, int empid, int funcid)
  123. {
  124. if (empid == 0)
  125. {
  126. return true;
  127. }
  128. var user = new u_user_jlhprice() { empid = empid };
  129. if (DbSqlHelper.SelectOne(cmd, user, "empid,rightstring") != 1)
  130. {
  131. throw new Exception(string.Format("查询用户信息失败,empid:{0}", empid));
  132. }
  133. return HasPower(funcid, user.rightstring);
  134. }
  135. private static bool HasPower(int funcid, string sys_pwrstr)
  136. {
  137. bool hasPower;
  138. hasPower = funcid > 0 && sys_pwrstr.Length >= funcid &&
  139. sys_pwrstr.Substring(funcid - 1, 1) == "1";
  140. return hasPower;
  141. }
  142. private static Dictionary<int, sys_func_pwr> _funcCache = new Dictionary<int, sys_func_pwr>();
  143. class sys_func_pwr
  144. {
  145. public int funcid { get; set; }
  146. public byte functype { get; set; }
  147. public int parentid { get; set; }
  148. }
  149. private static void LoadFuncCache(SqlCommand cmd)
  150. {
  151. if (_funcCache.Count == 0)
  152. {
  153. lock (_funcCache)
  154. {
  155. if (_funcCache.Count == 0)
  156. {
  157. cmd.CommandText = "SELECT funcid,functype,parentid FROM sys_func_pwr";
  158. cmd.Parameters.Clear();
  159. using (var reader = cmd.ExecuteReader())
  160. {
  161. while (reader.Read())
  162. {
  163. var func = new sys_func_pwr
  164. {
  165. funcid = Convert.ToInt32(reader["funcid"]),
  166. functype = Convert.ToByte(reader["functype"]),
  167. parentid = Convert.ToInt32(reader["parentid"]),
  168. };
  169. _funcCache[func.funcid] = func;
  170. }
  171. }
  172. }
  173. }
  174. }
  175. }
  176. /// <summary>
  177. /// 过滤出当前用户有的权限列表
  178. /// </summary>
  179. /// <param name="empid">当前用户empid</param>
  180. /// <returns></returns>
  181. public static List<int> FilterMyFunids(SqlCommand cmd, int empid)
  182. {
  183. LoadFuncCache(cmd);
  184. var rslt = new HashSet<int>();
  185. var user = new u_user_jlhprice() { empid = empid};
  186. if (DbSqlHelper.SelectOne(cmd, user, "empid,rightstring") != 1)
  187. {
  188. throw new Exception(string.Format("查询用户信息失败,empid:{0}", empid));
  189. }
  190. foreach (var funcItem in _funcCache)
  191. {
  192. var hasPower = empid == 0 || HasPower(funcItem.Value.funcid, user.rightstring);
  193. if (hasPower && !rslt.Contains(funcItem.Value.funcid))
  194. {
  195. rslt.Add(funcItem.Value.funcid);
  196. }
  197. }
  198. return rslt.ToList();
  199. }
  200. public static List<int> getPowerDept(SqlCommand cmd, int empid)
  201. {
  202. List<int> rslt = new List<int>();
  203. var powerstr = "-1";
  204. string userid;
  205. cmd.CommandText = @"SELECT deptstr,userid FROM u_user_jlhprice WHERE Empid=@empid";
  206. cmd.Parameters.Clear();
  207. cmd.Parameters.AddWithValue("@empid", empid);
  208. using (var reader = cmd.ExecuteReader())
  209. {
  210. if (reader.Read())
  211. {
  212. powerstr = reader["deptstr"].ToString().Trim();
  213. userid = reader["userid"].ToString().Trim();
  214. if (userid.ToLower() == "super")
  215. {
  216. powerstr = "0";
  217. }
  218. }
  219. }
  220. if (string.IsNullOrEmpty(powerstr) || powerstr.Equals("-1"))
  221. {
  222. return rslt;
  223. }
  224. cmd.CommandText = "select deptid from u_dept";
  225. if (powerstr != "0")
  226. {
  227. cmd.CommandText += string.Format(" WHERE deptid IN ({0})", powerstr.Trim(','));
  228. }
  229. cmd.Parameters.Clear();
  230. using (var reader = cmd.ExecuteReader())
  231. {
  232. while (reader.Read())
  233. {
  234. rslt.Add(Convert.ToInt32(reader["deptid"]));
  235. }
  236. }
  237. return rslt;
  238. }
  239. public static List<string> getPowerOutRep(SqlCommand cmd, int empid)
  240. {
  241. List<string> rslt = new List<string>();
  242. var powerstr = "-1";
  243. string userid;
  244. cmd.CommandText = @"SELECT outrepstr,userid FROM u_user_jlhprice WHERE Empid=@empid";
  245. cmd.Parameters.Clear();
  246. cmd.Parameters.AddWithValue("@empid", empid);
  247. using (var reader = cmd.ExecuteReader())
  248. {
  249. if (reader.Read())
  250. {
  251. powerstr = reader["outrepstr"].ToString().Trim();
  252. userid = reader["userid"].ToString().Trim();
  253. if (userid.ToLower() == "super")
  254. {
  255. powerstr = "0";
  256. }
  257. }
  258. }
  259. cmd.CommandText = "select username from u_user_jlhprice";
  260. if (powerstr != "0")
  261. {
  262. cmd.CommandText += string.Format(" WHERE username IN ({0})", powerstr.Trim(','));
  263. }
  264. cmd.Parameters.Clear();
  265. using (var reader = cmd.ExecuteReader())
  266. {
  267. while (reader.Read())
  268. {
  269. rslt.Add(Convert.ToString(reader["username"]).Trim());
  270. }
  271. }
  272. return rslt;
  273. }
  274. /// <summary>
  275. /// 判断用户是否已锁定
  276. /// </summary>
  277. /// <param name="user"></param>
  278. /// <returns></returns>
  279. public static bool IsLocked(u_user_jlhprice user)
  280. {
  281. // 检查是否在最近一个月内累计5次错误
  282. var cutoff = DateTime.UtcNow.AddMonths(-1);
  283. return user.empid != 0 && user.access_failed_count >= 5
  284. && user.last_failed_attempt_time >= cutoff;
  285. }
  286. /// <summary>
  287. /// 账号解锁
  288. /// </summary>
  289. /// <param name="user"></param>
  290. /// <returns></returns>
  291. public static bool UnLock(SqlCommand cmd, List<int> empids)
  292. {
  293. if (empids == null && empids.Count <= 0) return false;
  294. cmd.CommandText = $@"UPDATE u_user_jlhprice SET access_failed_count = 0,
  295. last_failed_attempt_time = GETUTCDATE()
  296. WHERE u_user_jlhprice.empid IN {ListEx.getString(empids)}";
  297. cmd.Parameters.Clear();
  298. return cmd.ExecuteNonQuery() == 1;
  299. }
  300. }
  301. }