一、背景
在前后端分离开发的背景下,后端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)) {//生成tokenreturn 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;}