表 (api实现用户登录注册过滤器判断过滤)
customer 》》 user
表间关系
user----customer(1对1)
用户表(user)
ID | Name | Password | RoleID | CustomerID | Token |
---|
主键 | 用户名(手机号) | 密码(MD5加密) | 所属权限 | 对应顾客 | 判断登录属性 |
顾客表
ID | Phone | Nickname | Avatar | Sex |
---|
主键 | 手机号 | 昵称(随机生成) | 头像随机从数据库获取 | 性别 |
业务流程
1. 用户注册自动生成用户信息(customer信息)向user表插入用户名(phone)密码
(password)
2. 在用户表插入token(自动生成 用户名+时间戳(发令时间))
3. 自动生成customer的一些参数如用户昵称(随机生成)用户头像
(随机从数据库获取)
电话(从用户表获取)
4.用户再次登录时要重新生成token
过滤器
1.首先app在头文件里要有对应的值如uid,token
2.在过滤器里要判断访问控制器和action是否是登录或注册是就不去判断请求头信息
否判断
string controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
//得到action名
string actionName = actionContext.ActionDescriptor.ActionName;
//如果是用户登陆注册不跳页面
if (controllerName == "User" && (actionName == "Regist" || actionName == "Login"))
{
base.OnActionExecuting(actionContext);
return;
}
3.如果不是就去判断响应头的内容看是否为空并且去数据库匹配token是否正确,
正确通过,
不正确返回错误信息
//获取Headers中是否包含uid和token如果包含则返回
bool isHaveUid = actionContext.Request.Headers.Contains("uid");
bool isHaveToken = actionContext.Request.Headers.Contains("token");
//bool isHaveSignature = actionContext.Request.Headers.Contains("signature");
if (isHaveUid && isHaveToken)
{
//得到签名
// string signature = actionContext.Request.Headers.GetValues("signature").ToList()[0];
//得到表头uid的值
string uid = actionContext.Request.Headers.GetValues("uid").ToList()[0];
//得到表头token的值
string token = actionContext.Request.Headers.GetValues("token").ToList()[0];
int _uid;
bool resuit = int.TryParse(uid, out _uid);
if (!resuit)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK,
new { isLogin = false, mgs = "请求uid参数格式有误!" });
return;
}
List<User> users = bll.Search(x => x.ID == _uid);
if (users.Count==0)
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK,
new { isLogin = false, mgs = "用户uid有误!" });
return;
}
User user = users[0];
//Token是否相同
if (user.Token != token)
{
//结束请求返回类(json)
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK,
new { isLogin = false, mgs = "token错误!" });
return;
}
判断签名是否一致
//if (signatureCreate(user.Name, user.Password) != signature)
//{
// // 结束请求返回类(json)
// actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK,
new { isLogin = false, mgs = "signature错误!" });
// return;
//}
}
else
{
//结束请求返回类(json)
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK,
new { isLogin = false, mgs = "缺少必要的参数!" });
return;
}
//全部正确执行
base.OnActionExecuting(actionContext);
}
4.注意事项
//得到controller 的名
string controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
//得到action名
string actionName = actionContext.ActionDescriptor.ActionName;
//获取Headers中是否包含uid和token如果包含则返回
bool isHaveUid = actionContext.Request.Headers.Contains("uid");
bool isHaveToken = actionContext.Request.Headers.Contains("token");
//得到表头uid的值
string uid = actionContext.Request.Headers.GetValues("uid").ToList()