授权
如果请求是被授权的,则将请求交给API业务处理,如果请求时未被授权的,则将请求立刻转给http 403状态码
访问控制
ACL:Access Control Lists
简单易用,实现容易,无法满足复杂的业务需求,不易管理
RBAC:Role Based Access Control
引入角色概念,简化管理。开发起来相对于ACL复杂
根据ACL实现简易授权,给每个用户赋予应有的权限
主要代码
用户表增加字段permissions权限字段,并给每个用户赋值,r–读,w—写
添加一个拦截器,之前流控、认证都是用的filter,审计日志用的拦截器,授权在审计之后执行所以不能使用filter
@Component
public class ACLInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("4");
User user= (User) request.getAttribute("user");
boolean result=true;
if(user==null){
response.setContentType("text/plain");
response.getWriter().write("need authentication");
response.setStatus(HttpStatus.UNAUTHORIZED.value());
result=false;
}else{
String method=request.getMethod();
if(!user.hasPermissions(method)){
response.setContentType("text/plain");
response.getWriter().write("forbidden");
response.setStatus(HttpStatus.FORBIDDEN.value());
result=false;
}
}
return result;
}
}
public boolean hasPermissions(String method) {
boolean result=false;
if(StringUtils.equalsAnyIgnoreCase("get",method)){
result=StringUtils.contains(permissions,"r");
}
else{
result=StringUtils.contains(permissions,"w");
}
return result;
}
注:根据请求,如果get方法是只有只读权限,其他方法为写权限