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;