AuthController.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. 
  2. using OASystem.Infrastructure.Repositories.Login;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Security.Claims;
  5. using OASystem.Domain.Dtos.UserDto;
  6. using OASystem.API.OAMethodLib;
  7. using Serilog.Parsing;
  8. using OASystem.Domain.Dtos.System;
  9. using System.Drawing.Drawing2D;
  10. using System.Collections;
  11. namespace OASystem.API.Controllers
  12. {
  13. /// <summary>
  14. /// 鉴权相关
  15. /// </summary>
  16. [Route("api/")]
  17. public class AuthController : ControllerBase
  18. {
  19. private readonly IMapper _mapper;
  20. private readonly IConfiguration _config;
  21. private readonly LoginRepository _loginRep;
  22. private readonly MessageRepository _message;
  23. private readonly SystemMenuPermissionRepository _SystemMenuPermissionRepository;
  24. public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper,MessageRepository message,
  25. SystemMenuPermissionRepository systemMenuPermissionRepository)
  26. {
  27. _config = config;
  28. _loginRep = loginRep;
  29. _mapper = mapper;
  30. _message = message;
  31. _SystemMenuPermissionRepository = systemMenuPermissionRepository;
  32. }
  33. /// <summary>
  34. /// 用户登录
  35. /// </summary>
  36. /// <param name="dto"></param>
  37. /// <returns></returns>
  38. [Route("login")]
  39. [HttpPost]
  40. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  41. public async Task<IActionResult> LoginAsync(LoginDto dto)
  42. {
  43. #region 校验用户信息
  44. var userData = _loginRep.Login(dto).Result;
  45. if (userData.Code != 0)
  46. {
  47. if (userData.Code != 0) { return Ok(JsonView(false, userData.Msg)); }
  48. return Ok(JsonView(false, "暂无该员工信息!"));
  49. }
  50. #endregion
  51. Result authData = null;
  52. if (userData.Data != null)
  53. {
  54. var uid = (userData.Data as UserLoginInfoView).UserId;
  55. authData = _SystemMenuPermissionRepository.QueryMenuLoad(uid, dto.PortType);
  56. }
  57. var view = new LoginView
  58. {
  59. UserInfo = userData == null ? null : userData.Data,
  60. AuthData = authData == null ? null : authData.Data,
  61. };
  62. DateTime createZebraTime = DateTime.Now;
  63. string authorId = dto.Number + "Token";
  64. string authorToken = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync<string>(authorId);//string 取
  65. if (authorToken != null)
  66. {
  67. #region 解析出过期时间
  68. var jwtHandler = new JwtSecurityTokenHandler();
  69. JwtSecurityToken securityToken = jwtHandler.ReadJwtToken(authorToken);
  70. DateTime expDt = (securityToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate();
  71. #endregion
  72. if (expDt >= createZebraTime) //超时重新获取token
  73. {
  74. authorToken = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
  75. }
  76. view.Expires = expDt;
  77. view.Token = authorToken;
  78. }
  79. else
  80. {
  81. view.Expires = createZebraTime.AddMinutes(30);
  82. view.Token = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
  83. TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
  84. await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(authorId, view.Token, ts);//string 存
  85. }
  86. #region 测试添加系统消息
  87. //await _message.AddMsg(new MessageDto()
  88. //{
  89. // Type = 1,
  90. // IssuerId = 208,
  91. // Title = "测试添加消息标题",
  92. // Content = "消息体测试",
  93. // ReleaseTime = DateTime.Now,
  94. // UIdList = new List<int> {
  95. // 5,
  96. // 208,
  97. // 219
  98. // }
  99. //});
  100. #endregion
  101. return Ok(JsonView(view));
  102. }
  103. /// <summary>
  104. /// 申请注册
  105. /// </summary>
  106. /// <param name="dto"></param>
  107. /// <returns></returns>
  108. [Authorize]
  109. [HttpPost]
  110. [Route("register")]
  111. public async Task<IActionResult> Register(RegisterDto dto)
  112. {
  113. var userData = _loginRep.Register(_loginRep, dto);
  114. if (userData.Result.Code != 0)
  115. {
  116. if (userData.Result.Code != 0) { return Ok(JsonView(false, userData.Result.Msg)); }
  117. return Ok(JsonView(false, "注册失败!"));
  118. }
  119. return Ok(new { Code = 0, Msg = userData.Result.Msg });
  120. }
  121. /// <summary>
  122. /// 修改密码
  123. /// </summary>
  124. /// <param name="dto"></param>
  125. /// <returns></returns>
  126. [Authorize]
  127. [HttpPost]
  128. [Route("UpdPassword")]
  129. public async Task<IActionResult> UpdateUserPassword(UpdateDto dto)
  130. {
  131. Result result = new Result();
  132. Sys_Users sys_Users = _mapper.Map<Sys_Users>(dto);
  133. var _UpdateState = await _loginRep.UpdateAsync(s => s.Id == dto.UserId, ss => sys_Users);
  134. if (_UpdateState)
  135. {
  136. result.Code = 0;
  137. result.Msg = "申请成功!人事主管审核后且信息部经理分配了登录账号,可登录OA!";
  138. }
  139. else
  140. {
  141. result.Code = -2;
  142. result.Msg = "用户修改失败!";
  143. }
  144. return Ok(JsonView(result));
  145. }
  146. /// <summary>
  147. /// 测试auth
  148. /// </summary>
  149. /// <param name="dto"></param>
  150. /// <returns></returns>
  151. [OASystemAuthentication]
  152. [HttpPost("TestToken")]
  153. [ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
  154. public async Task<IActionResult> TestToken(LoginDto dto)
  155. {
  156. string authorId = dto.Number + "Token";
  157. // 从Redis里面取数据
  158. //string userToken = _redis.StringGet(authorId);
  159. string userToken = "";
  160. var view = new LoginView
  161. {
  162. Token = authorId + ":" + userToken
  163. };
  164. return Ok(JsonView(view));
  165. }
  166. }
  167. }