手机版网站如何做,wordpress 3.6,公益网站 html 模板,wp上的wordpressJava解决垂直鉴权问题#xff08;对垂直权限进行校验#xff09; 文章目录 Java解决垂直鉴权问题#xff08;对垂直权限进行校验#xff09;前言一、垂直鉴权是什么#xff1f;二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…Java解决垂直鉴权问题对垂直权限进行校验 文章目录 Java解决垂直鉴权问题对垂直权限进行校验前言一、垂直鉴权是什么二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截器 前言
避免垂直鉴权实现原理每次用户访问时都要判定该用户是否有访问此 URL 的权限。 一、垂直鉴权是什么
垂直权限漏洞是指Web应用没有做权限控制或仅仅在菜单上做了权限控制导致恶意用户只要猜到了其他页面的URL就可以访问或控制其他角色拥有的数据或页面达到权限提升的目的。 垂直权限的漏洞举例Web应用程序在服务端没有做权限控制只是在前端菜单显示上将部分页面隐藏了。此时恶意用户可以猜测其他管理页面的 URL就可以访问或控制其他角色拥有的数据或页面达到越权操作的目的可能会使得普通用户拥有了管理员的权限。 二、实现过程
1.新建接口权限菜单映射表 /*** p* 接口权限映射表* /p*/
Getter
Setter
Accessors(chain true)
TableName(ed_interface_mapping)
public class InterfaceMapping implements Serializable {private static final long serialVersionUID 1L;/*** 主键id*/TableId(value id, type IdType.AUTO)private Integer id;/*** 接口路径*/TableField(interface_path)private String interfacePath;/*** 对应权限菜单*/TableField(permission)private String permission;
}2.项目初始化时加载接口菜单映射关系 Slf4j
Component
RequiredArgsConstructor
public class VerticalPermissionHandle {//应用上下文Web应用程序的基本URL路径Value(${server.servlet.context-path})private String contextPath;private final InterfaceMappingService interfaceMappingService;private MapString, ListString map;/*** 项目初始化时加载接口菜单映射关系*/PostConstructpublic void init() {log.info(加载权限开始);//查询出所有的接口菜单映射关系ListInterfaceMapping interfaceMappings interfaceMappingService.list();if (ObjectUtil.isEmpty(interfaceMappings)) {throw new BizException(ResultEnum.ERROR.getCode(), 启动失败,未加载垂直权限关系);}this.map new HashMap();/*** key为接口url* value为菜单防止出现相同的接口url在多个权限菜单中出现这种情况可能性很小这里使用list存储菜单*/interfaceMappings.stream().forEach(data - {String key contextPath data.getInterfacePath();ListString value;if (map.containsKey(key)) {value map.get(key);} else {value new ArrayList();}value.add(data.getPermission());map.put(key, value);});log.info(加载权限结束);}public ListString verticalPermission(String path) {ListString result map.get(path);if (ObjectUtil.isEmpty(result)) {return new ArrayList();}return result;}
}
3.自定义过滤器拦截器
/*** 自定义单点登录过滤器* 注CheckFilter类为自己写的过滤器与此业务无关* doCheck也是自定义的过滤器方法可忽略* 具体业务逻辑如下已实现*/
Slf4j
public class SsoFilter extends CheckFilter {Overrideprotected boolean doCheck(HttpServletRequest request, HttpServletResponse response) throws IOException {String uri request.getRequestURI();String token request.getHeader(token);if (!verticalPermissionCheck(uri, token)) {log.info( [当前访问接口uri] : {} , uri);//用来接口返回提示前端可加可不加response.setHeader(Access-Control-Allow-Origin, *);response.setHeader(Access-Control-Allow-Headers, token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified);response.setContentType(application/json;charsetutf-8);ObjectMapper objectMapper new ObjectMapper();ServletOutputStream writer response.getOutputStream();writer.write(objectMapper.writeValueAsBytes(当前用户暂无该权限));writer.flush();writer.close();return false;}else {return true;}}/*** 判断url所对应的菜单是否存在于登录用户的权限菜单中* 存在则为true不存在则为false* param uri 用户访问的uri* param token 登录的token* return*/private boolean verticalPermissionCheck(String uri, String token) {ListString permissions verticalPermissionHandle.verticalPermission(uri);if (ObjectUtil.isEmpty(permissions)){return true;}/*** 在redis中获取用户信息* 其中用户信息包含这个角色所对应的permission菜单* 遍历根据url这个key获取的value菜单如果存在这个角色所对应的菜单中则放行*/User userByToken UserUtils.getUserByToken(token);for (String permission : permissions) {if (userByToken.getAllPermissionString().contains(permission)) {return true;}}return false;}