accessToken实现
utils/request.js中通过http headers实现access-token的传递
newOptions.headers = {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'access-token': localStorage.getItem('access-token'),
...newOptions.headers,
};
WCF服务端重写IDispatchMessageInspector中的AfterReceiveRequest截取客户端传递进来的headers中的accessToken,AfterReceiveRequest中实现方法目的是在调用接口前进行判断,如果没有权限那么返回一个webhttp异常即可停止接口调用。
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
//获取客户端请求httpHeader
var httpHeader = request.Properties["httpRequest"] as HttpRequestMessageProperty;
//获取客户端请求httpHeader中的access-token值
string accessToken = httpHeader.Headers["access-token"];
//获取客户端请求httpHeader中的请求接口名称
string requestInterface = request.Properties["HttpOperationName"].ToString();
//验证客户端请求httpHeader中的令牌
JObject JsonAccessToken = JsonWebToken.Verification(accessToken);
//查询字典中是否有不需要Token验证的接口 或者 Token验证已通过
if (NoVerification.Where(q => q.Value.ToString() == requestInterface).Count() > 0 || JsonAccessToken != null)
{
}
else
{
throw new WebFaultException<string>("用户没有权限(令牌、用户名、密码错误)。", HttpStatusCode.Unauthorized);
}
return null;
}
接口中使用如下规范对数据进行包裹,用于ant.design.pro的实际使用,layui pro或微信小程序中也应使用该规范对数据进行一层各类状态的包裹。
********************************** 自行根据理解去实现
根据ant.design.pro架构,角色权限对应menu中数据结构都包含了Authority(理解为所属角色)属性,从而实现不同角色不同菜单的方法,那么WCF服务端应该每次都验证accessToken和角色,避免有Token授权情况下从客户端修改伪造Authority的问题,ant.design.pro角色权限控制只是基于客户端实现,实际项目中应该在服务端进行验证,menu数据也应从服务端动态生成(传递具有Authority属性的menu json数据或直接传递服务端已进行权限筛选过的menu json数据,为符合ant.design.pro架构思路建议选择前者)。
interfaceDataPackage.currentAuthority = "admin";
注:通过http header方式传递accessToken还可以实现接口权限控制从而再增加一层安全性(Token验证、Authority验证 + 接口权限验证,Token按需放入缓存,Authority需调用用户数据比对传递至服务端的角色是否一致,接口权限验证需要在服务端启动时接口权限数据放入内存中避免每次都调用数据库),应用场景:不同角色有不同访问的接口权限,需要根据上下游供应商开放不同接口等等。
网友评论