登录相关方法的参数改为使用token,而不是Credential。
新增ReadOnlyRole角色,用于账号被顶出后自动将界面设置为只读模式。
This commit is contained in:
SL 2023-09-18 10:13:40 +08:00
parent 4898aa6911
commit 6957751858
9 changed files with 89 additions and 49 deletions

View File

@ -230,20 +230,20 @@ namespace Aitex.Core.Account
AccountExManager.Instance.CancelLoginRequest(userName);
}
public void ConfirmLoginRequest(Credential requestingCred)
public void ConfirmLoginRequest(string userName)
{
AccountExManager.Instance.ConfirmedLoginRequest(requestingCred);
AccountExManager.Instance.ConfirmedLoginRequest(userName);
}
public void RejectLoginRequest(Credential requestingCred)
public void RejectLoginRequest(string userName)
{
AccountExManager.Instance.RejectLoginRequest(requestingCred);
AccountExManager.Instance.RejectLoginRequest(userName);
}
public void LogoutEx(Credential cred)
public void LogoutEx(Guid myToken)
{
AccountExManager.Instance.Logout(cred);
AccountExManager.Instance.Logout(myToken);
}
/// <summary>
@ -251,9 +251,9 @@ namespace Aitex.Core.Account
/// </summary>
/// <param name="token">客户端登录凭据令牌。</param>
/// <returns></returns>
public CredentialKeepAliveResults KeepAlive(Credential cred)
public CredentialKeepAliveResults KeepAlive(Guid myToken)
{
return CredentialManager.Instance.KeepAlive(cred);
return CredentialManager.Instance.KeepAlive(myToken);
}
}
}

View File

@ -199,17 +199,17 @@ public class CredentialManager : Singleton<CredentialManager>
/// </summary>
/// <param name="cred">客户端登录凭据</param>
/// <returns></returns>
public CredentialKeepAliveResults KeepAlive(Credential cred)
public CredentialKeepAliveResults KeepAlive(Guid myToken)
{
lock (_syncRoot)
{
if (_dictCredentialsLoggedIn.TryGetValue(cred.Token, out var loginCred))
if (_dictCredentialsLoggedIn.TryGetValue(myToken, out var loginCred))
{
loginCred.LastAliveTime = DateTime.Now; // 刷新时间
// 如果当前用户名在请求登录列表中则返回CredentialKeepAliveResults.RequestingLogin通知
// 已登录的客户端,当前用户正在请求异地登录。
return _dictCredentialsRequesting.ContainsKey(cred.AccountInfo.LoginName)
return _dictCredentialsRequesting.ContainsKey(loginCred.AccountInfo.LoginName)
? CredentialKeepAliveResults.RequestingLogin
: CredentialKeepAliveResults.Alive;
}

View File

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading.Tasks;
@ -57,7 +58,6 @@ namespace Aitex.Core.Account
#endregion
#region Permission Operations
@ -87,7 +87,6 @@ namespace Aitex.Core.Account
#endregion
#region Role Operations
/// <summary>
@ -137,7 +136,6 @@ namespace Aitex.Core.Account
#endregion
#region Account Operations
/// <summary>
@ -253,9 +251,9 @@ namespace Aitex.Core.Account
/// <summary>
/// 注销登录。
/// </summary>
/// <param name="cred">ƾ¾Ý</param>
/// <param name="myToken">当前登录的令牌</param>
[OperationContract]
void LogoutEx(Credential cred);
void LogoutEx(Guid myToken);
/// <summary>
/// 取消登录请求。
@ -267,25 +265,24 @@ namespace Aitex.Core.Account
/// <summary>
/// 确认异地登录请求。
/// </summary>
/// <param name="requestingCred"></param>
/// <param name="userName">正在请求登录的令牌</param>
[OperationContract]
void ConfirmLoginRequest(Credential requestingCred);
void ConfirmLoginRequest(string userName);
/// <summary>
/// 拒绝异地登录请求。
/// </summary>
/// <param name="requestingCred"></param>
/// <param name="userName">正在请求登录的令牌</param>
[OperationContract]
void RejectLoginRequest(Credential requestingCred);
void RejectLoginRequest(string userName);
/// <summary>
/// 激活凭据。
/// </summary>
/// <param name="cred">ƾ¾Ý</param>
/// <param name="myToken">当前登录的令牌</param>
/// <returns></returns>
[OperationContract]
CredentialKeepAliveResults KeepAlive(Credential cred);
CredentialKeepAliveResults KeepAlive(Guid myToken);
#endregion
}

View File

@ -577,6 +577,7 @@
<Compile Include="MECF\Framework\Common\Account\Extends\AccountEx.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\AppMenu.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\MenuLoader.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\ReadOnlyRole.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\Role.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\RoleLoader.cs" />
<Compile Include="MECF\Framework\Common\Account\Extends\UserContext.cs" />

View File

@ -285,10 +285,10 @@ namespace MECF.Framework.Common.Account
/// <summary>
/// 确认登录请求。
/// </summary>
/// <param name="requestingCred"></param>
internal void ConfirmedLoginRequest(Credential requestingCred)
/// <param name="userName"></param>
internal void ConfirmedLoginRequest(string userName)
{
var cred = CredentialManager.Instance.GetRequestingCredential(requestingCred.AccountInfo.LoginName);
var cred = CredentialManager.Instance.GetRequestingCredential(userName);
if (cred != null)
cred.State = CredentialState.Confirmed;
}
@ -296,24 +296,24 @@ namespace MECF.Framework.Common.Account
/// <summary>
/// 拒绝登录请求。
/// </summary>
/// <param name="requestingCred"></param>
internal void RejectLoginRequest(Credential requestingCred)
/// <param name="userName"></param>
internal void RejectLoginRequest(string userName)
{
var cred = CredentialManager.Instance.GetRequestingCredential(requestingCred.AccountInfo.LoginName);
var cred = CredentialManager.Instance.GetRequestingCredential(userName);
if (cred != null)
cred.State = CredentialState.Reject;
}
internal void Logout(Credential cred)
internal void Logout(Guid myToken)
{
var loginCred = CredentialManager.Instance.GetCredential(cred.Token);
var loginCred = CredentialManager.Instance.GetCredential(myToken);
if (loginCred != null)
{
EV.PostMessage(ModuleName.System.ToString(), EventEnum.UserLoggedOff,
$"{loginCred.AccountInfo.LoginName}@{loginCred.LoginIP}:{loginCred.LoginPort}");
}
CredentialManager.Instance.Remove(cred.Token);
CredentialManager.Instance.Remove(myToken);
}
#endregion

View File

@ -0,0 +1,25 @@
using MECF.Framework.Common.Account;
using MECF.Framework.Common.Account.Extends;
namespace MECF.Framework.Common.MECF.Framework.Common.Account.Extends
{
/// <summary>
/// 只读权限的角色。
/// </summary>
public class ReadOnlyRole : Role
{
#region Constructors
public ReadOnlyRole() : base("-1", "ReadOnly", false, 0, null, true, "")
{
}
#endregion
public override MenuPermissionEnum GetPermission(string name)
{
return MenuPermissionEnum.MP_NONE;
}
}
}

View File

@ -19,9 +19,9 @@ namespace MECF.Framework.Common.Account.Extends
private string _permissionContent;
private string _description;
#endregion
#endregion
#region Constructors
#region Constructors
/// <summary>
/// 构造角色的对象实例。
@ -146,7 +146,7 @@ namespace MECF.Framework.Common.Account.Extends
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public MenuPermissionEnum GetPermission(string name)
public virtual MenuPermissionEnum GetPermission(string name)
{
if (PermissionControlItems.TryGetValue(name, out var permissionEnum))
return permissionEnum;

View File

@ -290,36 +290,36 @@ namespace MECF.Framework.UI.Core.Accounts
});
}
public void ConfirmLoginRequest(Credential requestingCred)
public void ConfirmLoginRequest(string userName)
{
WCFProxy.Using(delegate(IAccountService svc)
{
svc.ConfirmLoginRequest(requestingCred);
svc.ConfirmLoginRequest(userName);
});
}
public void RejectLoginRequest(Credential requestingCred)
public void RejectLoginRequest(string userName)
{
WCFProxy.Using(delegate(IAccountService svc)
{
svc.RejectLoginRequest(requestingCred);
svc.RejectLoginRequest(userName);
});
}
public void LogoutEx(Credential cred)
public void LogoutEx(Guid myToken)
{
WCFProxy.Using(delegate(IAccountService svc)
{
svc.LogoutEx(cred);
svc.LogoutEx(myToken);
});
}
public CredentialKeepAliveResults KeepAlive(Credential cred)
public CredentialKeepAliveResults KeepAlive(Guid myToken)
{
var result = CredentialKeepAliveResults.NotFound;
WCFProxy.Using(delegate(IAccountService svc)
{
result = svc.KeepAlive(cred);
result = svc.KeepAlive(myToken);
});
return result;
}

View File

@ -22,11 +22,27 @@ namespace UserLoginTester
Console.WriteLine(@"Accounts:");
foreach (var acc in accounts)
{
Console.WriteLine($@" {acc.LoginName}");
Console.WriteLine($@" {acc.LoginName}");
}
Console.ResetColor();
while (true)
var ret = await AccountClient.Instance.Service.LoginEx("admin", "admin", "0", new LoginClientInfo());
if (ret.Result == LoginRequestResults.Confirmed)
{
Console.WriteLine("Login Succeeded!");
}
else
{
Console.WriteLine($"Login Failed, {ret.Result}");
}
Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();
AccountClient.Instance.Service.LogoutEx(ret.Credential.Token);
/*
while (true)
{
var cmd = WaitCommand();
if(string.IsNullOrEmpty(cmd))
@ -37,6 +53,7 @@ namespace UserLoginTester
ParseCommand(cmd);
}
*/
}
private static string WaitCommand()
@ -88,7 +105,7 @@ namespace UserLoginTester
private static void LogoutProcess()
{
AccountClient.Instance.Service.LogoutEx(_loginCred);
AccountClient.Instance.Service.LogoutEx(_loginCred.Token);
}
private static void Instance_OnDisconnectedWithRT()
@ -121,11 +138,11 @@ namespace UserLoginTester
switch (ack)
{
case "Y":
AccountClient.Instance.Service.ConfirmLoginRequest(requestingCred);
AccountClient.Instance.Service.LogoutEx(_loginCred);
AccountClient.Instance.Service.ConfirmLoginRequest(requestingCred.AccountInfo.LoginName);
AccountClient.Instance.Service.LogoutEx(_loginCred.Token);
break;
case "N":
AccountClient.Instance.Service.RejectLoginRequest(requestingCred);
AccountClient.Instance.Service.RejectLoginRequest(requestingCred.AccountInfo.LoginName);
break;
default:
goto __prompt;