From 7821b0b7053a6652f48f2299c286567e273c6f2c Mon Sep 17 00:00:00 2001 From: falcon <9504402@qq.com> Date: Mon, 13 Apr 2020 08:35:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=94=A8=E6=88=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=99=BB=E5=87=BA=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAuth/Controllers/api/ApiControllerBase.cs | 1 + FAuth/Controllers/api/UserController.cs | 38 ++++++++++++++++--- FAuth/DataBase/Tables/FUser.cs | 8 ++++ FAuth/DataBase/Tables/FUserStatusEnum.cs | 16 ++++++++ .../ApiExceptionFilterAttribute.cs | 3 +- FAuth/Extensions/Decryptor/UserTicketModel.cs | 8 +++- FAuth/Models/ApiErrorResult.cs | 2 +- FAuth/Startup.cs | 2 +- 8 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 FAuth/DataBase/Tables/FUserStatusEnum.cs rename FAuth/{Models => Extensions}/ApiExceptionFilterAttribute.cs (93%) diff --git a/FAuth/Controllers/api/ApiControllerBase.cs b/FAuth/Controllers/api/ApiControllerBase.cs index 9f99289..f0700f9 100644 --- a/FAuth/Controllers/api/ApiControllerBase.cs +++ b/FAuth/Controllers/api/ApiControllerBase.cs @@ -1,4 +1,5 @@ using System; +using FAuth.Extensions; using FAuth.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; diff --git a/FAuth/Controllers/api/UserController.cs b/FAuth/Controllers/api/UserController.cs index cd854b4..fab855f 100644 --- a/FAuth/Controllers/api/UserController.cs +++ b/FAuth/Controllers/api/UserController.cs @@ -38,14 +38,14 @@ namespace FAuth.Controllers.api } /// - /// 验证用户名密码是否匹配 + /// 用户登录方法 /// /// 用户名 /// 密码 - /// 是否匹配 + /// 登录结果 [HttpPost] [ProducesResponseType(typeof(CheckUserResult),200)] - public CheckUserResult CheckUser(string userName,string password) { + public CheckUserResult Login(string userName,string password) { if(userName.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(userName)); } @@ -54,15 +54,39 @@ namespace FAuth.Controllers.api throw new Exception("提供的用户名或密码不正确"); } var fir = qu.First(); - fir.LastLoginDatetime = DateTimeOffset.Now; + var now = DateTimeOffset.Now; + fir.LastLoginDatetime = now; + fir.Status |= FUserStatusEnum.Login; this.Db.SaveChangesAsync().Wait(); return new CheckUserResult { Ticket = this.UserTicketDryptor.Encrypt(new UserTicketModel { Id = fir.Id, UserName = fir.UserName, + LoginDatetime = now, }), }; } + /// + /// 登出用户 + /// + /// 用户票据 + /// 是否成功 + [HttpPost] + public bool Logout(string ticket) { + if(ticket.IsNullOrEmpty()) { + throw new ArgumentNullException(nameof(ticket)); + } + var userTicketModel = this.UserTicketDryptor.Decrypt(ticket); + var qu = this.Db.Users.Where(m => m.Id == userTicketModel.Id); + if(!qu.Any()) { + throw new Exception("提交的票据信息错误"); + } + var fir = qu.First(); + fir.Status &= ~FUserStatusEnum.Login; + fir.LastLogoutDatetime = DateTimeOffset.Now; + this.Db.SaveChangesAsync().Wait(); + return true; + } /// /// 根据用户凭据获取用户信息 @@ -75,13 +99,15 @@ namespace FAuth.Controllers.api if(ticket.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(ticket)); } - UserTicketModel userTicketModel = null; - userTicketModel = this.UserTicketDryptor.Decrypt(ticket); + var userTicketModel = this.UserTicketDryptor.Decrypt(ticket); var qu = this.Db.Users.Where(m => m.Id == userTicketModel.Id); if(!qu.Any()) { throw new Exception("提交的票据信息错误"); } var fir = qu.First(); + if(fir.LastLogoutDatetime.HasValue && userTicketModel.LoginDatetime < fir.LastLogoutDatetime.Value) { + throw new Exception("用户已登出"); + } return new UserInfo { Id = fir.Id, LastLoginDatetime = fir.LastLoginDatetime, diff --git a/FAuth/DataBase/Tables/FUser.cs b/FAuth/DataBase/Tables/FUser.cs index d30e12b..3afce6d 100644 --- a/FAuth/DataBase/Tables/FUser.cs +++ b/FAuth/DataBase/Tables/FUser.cs @@ -29,8 +29,16 @@ namespace FAuth.DataBase.Tables [Required, MaxLength(20)] public string Password { get; set; } /// + /// 账号状态 + /// + public FUserStatusEnum Status { get; set; } + /// /// 上次登录时间 /// public DateTimeOffset? LastLoginDatetime { get; set; } + /// + /// 上次登出时间 + /// + public DateTimeOffset? LastLogoutDatetime { get; set; } } } diff --git a/FAuth/DataBase/Tables/FUserStatusEnum.cs b/FAuth/DataBase/Tables/FUserStatusEnum.cs new file mode 100644 index 0000000..02686ae --- /dev/null +++ b/FAuth/DataBase/Tables/FUserStatusEnum.cs @@ -0,0 +1,16 @@ +using System; + +namespace FAuth.DataBase.Tables +{ + /// + /// 账号状态 + /// + [Flags] + public enum FUserStatusEnum + { + /// + /// 是否已登录 + /// + Login = 1 + } +} diff --git a/FAuth/Models/ApiExceptionFilterAttribute.cs b/FAuth/Extensions/ApiExceptionFilterAttribute.cs similarity index 93% rename from FAuth/Models/ApiExceptionFilterAttribute.cs rename to FAuth/Extensions/ApiExceptionFilterAttribute.cs index e6641f8..3402755 100644 --- a/FAuth/Models/ApiExceptionFilterAttribute.cs +++ b/FAuth/Extensions/ApiExceptionFilterAttribute.cs @@ -1,10 +1,11 @@ using System; +using FAuth.Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; -namespace FAuth.Models +namespace FAuth.Extensions { /// /// Api控制器返回异常 diff --git a/FAuth/Extensions/Decryptor/UserTicketModel.cs b/FAuth/Extensions/Decryptor/UserTicketModel.cs index 66507f2..26522dc 100644 --- a/FAuth/Extensions/Decryptor/UserTicketModel.cs +++ b/FAuth/Extensions/Decryptor/UserTicketModel.cs @@ -1,4 +1,6 @@ -namespace FAuth.Extensions.Decryptor +using System; + +namespace FAuth.Extensions.Decryptor { /// /// 用户票据中的用户信息 @@ -13,5 +15,9 @@ /// 登录用户名称 /// public string UserName { get; set; } + /// + /// 登录时间 + /// + public DateTimeOffset LoginDatetime { get; set; } } } diff --git a/FAuth/Models/ApiErrorResult.cs b/FAuth/Models/ApiErrorResult.cs index d73740c..f893565 100644 --- a/FAuth/Models/ApiErrorResult.cs +++ b/FAuth/Models/ApiErrorResult.cs @@ -6,7 +6,7 @@ public class ApiErrorResult { /// - /// 异常信心 + /// 异常信息 /// public string Message { get; set; } /// diff --git a/FAuth/Startup.cs b/FAuth/Startup.cs index fd1092e..f07148e 100644 --- a/FAuth/Startup.cs +++ b/FAuth/Startup.cs @@ -4,8 +4,8 @@ using System.Text.Encodings.Web; using System.Text.Unicode; using Falcon.Extend; using FAuth.DataBase; +using FAuth.Extensions; using FAuth.Extensions.Decryptor; -using FAuth.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore;