### 概要说明

1. 使用token来验证两个系统,进行用户登录已经称为了通用做法。

1. 要集成ccflow,jflow 采用双方独立调用模式部署,就需要通过token验证。

1. 我们根据不同的场景,设置两个模式在系统配置文件里进行配置,TokenMode

1. TokenMode=0 是宽泛模式,就是一个账号可以登录多个终端,登录每个终端都产生一个token,这几个token在登录的时间里,一直有效,同时有效。

1. TokenMode=1 是单点模式,类似于微信的登录,在一台机器登录后,另外一台机器登录就会强制退出。

### 调用方法.

生成token

/// <summary>
/// 生成token
/// </summary>
/// <param name="logDev">设备</param>
/// <returns></returns>
public static string Port_GenerToken(string logDev = "PC")
{
//单点模式,严格模式.
if (SystemConfig.TokenModel == 1)
return Port_GenerToken_2021(BP.Web.WebUser.No, logDev, 0, false);

//记录token.
BP.Port.Token tk = new Token();
tk.MyPK = DBAccess.GenerGUID();

tk.EmpNo = BP.Web.WebUser.No;
tk.EmpName = BP.Web.WebUser.Name;

tk.DeptNo = BP.Web.WebUser.FK_Dept;
tk.DeptName = BP.Web.WebUser.FK_DeptName;

tk.OrgNo = BP.Web.WebUser.OrgNo;
tk.OrgName = BP.Web.WebUser.OrgName;
tk.RDT = DataType.CurrentDateTime; //记录日期.

if (logDev.Equals("PC"))
tk.SheBei = 0;
else
tk.SheBei = 1;

return tk.MyPK;
}

使用token登录.

/// <summary>
/// 按照token登录 2021.07.01 采用新方式.
/// </summary>
/// <param name="token"></param>
public static string Port_LoginByToken(string token)
{
try
{
if (DataType.IsNullOrEmpty(token))
throw new Exception("err@ token 不能为空.");

token = token.Trim();
if (DataType.IsNullOrEmpty(token) == true)
throw new Exception("err@非法的Token.");


//如果是宽泛模式.
if (SystemConfig.TokenModel == 0)
{
Token tk = new Token();
tk.MyPK = token;
if (tk.RetrieveFromDBSources()==0)
throw new Exception("err@ token 过期或失效.");

BP.Web.WebUser.No = tk.EmpNo;
BP.Web.WebUser.Name = tk.EmpName;

BP.Web.WebUser.FK_Dept = tk.DeptNo;
BP.Web.WebUser.FK_DeptName = tk.DeptName;

BP.Web.WebUser.OrgNo = tk.OrgNo;
BP.Web.WebUser.OrgName = tk.OrgName;

return tk.ToJson();

}


string sql = "SELECT No FROM WF_Emp WHERE AtPara LIKE '%" + token + "%'";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
if (dt.Rows.Count != 1)
throw new Exception("err@token失效." + token);

string no = dt.Rows[0][0].ToString();
//执行登录.
BP.WF.Dev2Interface.Port_Login(no);
return no;
}
catch (Exception ex)
{
throw ex;
}
}

### 配置方法.

1.  在ccflow里面设置 web.config 找到TokenModel节点,如果没有就增加一个。

1. 在java版本的jflow里面找到 jflow.properties , 同上。

###  TokenModel数据结构设计.

字段设计

Map map = new Map("Port_Token", "登录记录");
map.CodeStruct = "2";

map.AddMyPK();

map.AddTBString(TokenAttr.EmpNo, null, "人员编号", true, false, 0, 100, 20);
map.AddTBString(TokenAttr.EmpName, null, "人员名称", true, false, 0, 100, 20);

map.AddTBString(TokenAttr.DeptNo, null, "部门编号", true, false, 0, 100, 20);
map.AddTBString(TokenAttr.DeptName, null, "部门名称", true, false, 0, 100, 20);

map.AddTBString(TokenAttr.OrgNo, null, "组织编号", true, false, 0, 100, 20);
map.AddTBString(TokenAttr.OrgName, null, "组织名称", true, false, 0, 100, 20);

map.AddTBDateTime(TokenAttr.RDT, null, "记录日期", true, false);

map.AddTBInt(TokenAttr.SheBei, 0, "0=PC,1=移动", true, false);