接口的权限控制、登陆校验以及白名单的设置
在登陆成功之后,才可以去访问一些接口,否则其他的接口都是不可以访问状态,或者校验这个用户在发起请求的时候,是否是登陆状态,同时有些接口不需要登陆也可以访问,在这里做一个简单的记录。
首先,在看到这些需求的时候,要在配置文件里面进行配置白名单,之后读取白名单的配置文件获取到白名单的列表,这样就可以拿到了那写接口不需要判断。
其次,要做一个拦截器,在每一次前台发起请求的时候,用来拦截,之后进行比较,如果是白名单接口,则不需要进行拦截,直接放掉,如果需要拦截,则进行拦截,进行业务判断。
在之后,根据业务逻辑,判断白名单,之后,判断登陆权限,在判断角色权限,最后抛出异常,返给前台,告知前台信息。
1、读取白名单,以及设置拦截器
2、根据业务进行处理。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Map<String,String> map = CommonUtils.getIpAddr(request);
if (restList.contains(map.get("uri"))) {
logger.info(map.get("uri")+"是白名单");
return true;
}
// 检查每个到来的请求对应的session域中是否有登录标识
Object loginName = request.getSession().getAttribute("loginName");
if (null == loginName || !(loginName instanceof String)) {
// 未登录,重定向到登录页
throw new YzptException(CodeEnums.USER_TOKEN_FAIL);
}
String userName = (String) loginName;
System.out.println("当前用户已登录,登录的用户名为: " + userName);
return true;
}
用于处理请求资源的信息方法。
public static Map<String ,String> getIpAddr(HttpServletRequest request) {
Map<String ,String> map = new HashMap<String,String>();
String uri = request.getRequestURI();//返回请求行中的资源名称
String url = request.getRequestURL().toString();//获得客户端发送请求的完整url
String params = request.getQueryString();//返回请求行中的参数部分
String host = request.getRemoteHost();//返回发出请求的客户机的主机名
int port = request.getRemotePort();//返回发出请求的客户机的端口号。
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
map.put("host",host);
map.put("params",params);
map.put("url",url);
map.put("uri",uri);
map.put("port",String.valueOf(port));
map.put("ip",ip);
return map;
}
总结:在做开始做项目的时候,需要将整体的流程想清楚,之后分解项目模块,在进行每一块的编写和处理,代码不是很全,之后接口权限的控制我还没有写,主要就是在session里面标记,这个用户的身份,之后在请求的时候,进行拦截判断用户身份是不是可以调用这个接口就好了,因为之前在写功能的时候,把这些功能都写在了上面,所以截图和代码不是特别全