需求:需要给定一个只读用户权限,顾名思义,该权限的用户只拥有读的操作,能看,能翻页看,各种看,但是不能执行操作,删除,修改,添加等能影响到后台数据的都不能进行操作。
思路:一开始想的是怎么在页面进行控制,通过后台传值,在页面进行判断,将按钮进行disable不能操作的设置,但是实现起来会比较复杂,需要每个接口进行传值,页面接收值并进行判断。
后来跟同事沟通,发现其实也可以从后台进行控制,每个接口在最前边加一个判断,当是只读用户时,直接return,并返回信息,提示为只读用户,不能进行操作。这个实现起来相对来说简单很多,但是有个前提在用户登录时,保存在缓存中的用户信息,要保存角色的值,发起请求时需要在request中获取到当前用户的角色信息。实现代码如下:
@PostMapping(value = "/addWorkOrder")
public JSONObject doAddWorkOrderForImp(@RequestBody String body, HttpServletRequest request) {
if (ToolUtil.readOnly(request)){
return ToolUtil.failResult("当前用户为只读权限,无法执行操作!");
}
}
/**
* 判断当前用户角色权限是否只读
* @param request
* @return
*/
public static boolean readOnly(HttpServletRequest request){
boolean readOnly = false;
String token = request.getParameter("_token");
if (StringUtils.isNotBlank(token)){
//通过token获取当前登录用户的所有信息包括机构、角色等信息
JSONObject loginUser = UserCache.getLoginUser(token);
if (loginUser != null){
JSONObject role = loginUser.getJSONObject("role");
if (role != null){
//这里需要注意了:需要在角色表添加一个字段,是否只读的字段,可以默认是非只读,这样就不会造成对之前数据的影响
String read_only = role.getString("read_only");
//当read_only的值为1是则代表只读
if (StringUtils.equals(read_only,"1")){
readOnly = true;
}
}
}
}
return readOnly;
}
//返回信息的拼接
public static JSONObject failResult(String errorMessage) {
JSONObject result = new JSONObject();
result.put("code", 201);
result.put("errorMessage", errorMessage);
return result;
}