一、背景
在前后端分离开发的背景下,后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用,第二、后端管理系统接口调用(需要账号密码登录),第三、与第三方系统间的接口调用。所以如果同一个接口需要满足这三种场景,就需要做鉴权,要不然无法保障数据的安全。
二、定义三套接口方案
其实三套方法都可以通过token来进行鉴权
1.首先提供一个获取token的接口
/**
* 获取远程调用凭证
*/
@ApiOperation(value = "获取远程调用凭证", notes = "获取远程调用凭证")
@PostMapping("getRpcTonken")
public ResponseData<String> getRpcTonken (@RequestBody Map<String, Object> param) {
String userName = "";
String password = "";
if(param.containsKey("userName")) {
userName = param.get("userName").toString();
}
if(param.containsKey("password")) {
password = param.get("password").toString();
}
MTokenUser mTokenUserRes = mTokenUserService.searchByUserName(userName,password);
if (ObjectUtil.isNotEmpty(mTokenUserRes)) {
//生成token
return ResponseData.success(redisUtils.generateToken(mTokenUserRes));
}else {
log.error(MTokenUserConstant.QUERY_FAILED);
return ResponseData.error(MTokenUserConstant.QUERY_FAILED);
}
}
通过给定的账号和密码进行制作token,当然这里的账号和密码应该进行加密传输,获取的时候进行解密
/**
* 根据账号和密码查询
* searchByUserName
*/
public MTokenUser searchByUserName(String userName,String password) {
QueryWrapper<MTokenUser> wrapper = new QueryWrapper<MTokenUser>();
wrapper.eq("user_name", userName);
wrapper.eq("password", password);
MTokenUser mTokenUser = mTokenUserMapper.selectOne(wrapper);
return mTokenUser;
}
获取与验证token的合法性
public String generateToken(Object user){
//生成唯一不重复的字符串
String token = UUID.randomUUID().toString();
set(RedisKeys.getRpcToken(token), user, 7200);
return token;
}
/**
* 验证token是否合法
* @param token
* @return
*/
public boolean verify(String token){
String s = get(RedisKeys.getRpcToken(token));
if(!StringUtils.isEmpty(s)) {
return true;
}else {
return false;
}
}
三、在过滤器中对接口进行鉴权
public boolean memberAppAuth(ServerHttpRequest request, ServerHttpResponse response) {
// 获取token 小程序登录态认
String token = request.getHeaders().getFirst(Constant.resToken);
ResponseData<Boolean> res = baseAdminCLient.verifyToken(token );
if(res.getData()) {
return true;
}
return false;
}