在Java拦截器中处理用户横向越权的问题

1、问题场景:

       最近公司在研发一套新的项目,其中涉及到了用户查询端和管理员端(也就是后台),查询员有查询员的接口,管理员有管理员的接口,但是也有一些公共的接口,比如说文件上传,文件查看的接口。校验用户是否登录的条件是通过springSession完成的。
       出现的问题就是在使用swagger接口进行测试的时候,发现查询员登录成功之后,也可以访问管理员的接口,这就出现了横向越权的问题。

2、解决思路:

  1. 刚开始的想法是各自添加标识,管理端的接口自定义一个注解,查询端的接口自定义一个注解,未添加注解的就是公共接口,但是这样的工作量太大了,也不符合Java开发的思想和开发规范。所以被pass掉了。
  2. 后来想到了由于查询端的接口和公共的接口较少,分别给他们俩添加注解,没添加注解的就是管理端的接口,这种方法其实和第一种不相上下,也被果断的pass掉了
  3. 再后来又想到了Spring Security框架,但现实的问题是,目前做的只是第一版,权限和角色并没有进行彻底的分离,所以若要使用Spring
    Security框架的话,反而会把简单的问题复杂化,这种方式是目前不可取的,但是相比于上面的两种方法,在思想上已经进步了很多了(哈哈哈)
  4. 最后想到了一种方法,也是最后采用的一种方法。
            第一步:将查询端使用的接口全部放到一个Controller下面(因为查询端的接口较少),公共接口因为只有两个,所以就将它们进行了复制,管理端一份,查询端一份,其实他们service层是一模一样的。
            第二步:在用户登录上之后,根据用户类型的不同在他们的cookie中分别种上不同的标识(我添加的是userType)
            第三步:在这个查询端的Controller上面添加一个注解,在拦截器进行拦截,只要拦截到是添加这个注解的就是查询端的接口,没添加这个注解的就是管理端的接口,拦截到之后对cookie中的类型进行判断,判断类型是否合适,合适就通过,不合适就抛异常。

核心代码如下:

//获取类上的注解
CustomAuth customAuthAnnotation = method.getMethod().getDeclaringClass().getAnnotation(CustomAuth.class);
   if (!sessionService.validUserType(customAuthAnnotation,request.getSession())){
        throw new ErrorCodeException(ErrorCode.USER_AUTH_NOT_EXIST);
   }

(全部的拦截器的代码在之前的博客中)

这是目前想到的最合适也是最便捷的方法,网友们有比较合适的思路欢迎评论留言!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Java拦截器(Interceptor)可以用于对请求做统一的处理,如身份验证、请求日志记录等。如果需要在Java拦截器判断小程序发送的请求,可以通过获取请求头的信息进行判断。以下是一个简单的Java拦截器示例: ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MiniProgramInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求头的信息 String userAgent = request.getHeader("User-Agent"); String contentType = request.getContentType(); // 判断是否为小程序发送的请求 if (userAgent != null && userAgent.contains("MicroMessenger") && contentType != null && contentType.contains("application/json")) { // TODO: 根据业务需求进行相应的处理 return true; } else { // 返回错误信息 response.setContentType("application/json;charset=UTF-8"); response.getWriter().write("{ \"status\": 400, \"message\": \"Bad Request\" }"); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO: 在处理完请求后进行相应的操作 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO: 在请求完成后进行相应的操作 } } ``` 以上代码的MiniProgramInterceptor类实现了HandlerInterceptor接口,其的preHandle方法会在请求处理前被调用。在该方法,我们可以获取请求头的信息,通过判断判断是否为小程序发送的请求,如果是则进行相应的处理,否则返回错误信息。需要注意的是,以上代码仅为示例,实际应用还需要进行异常处理、安全验证等相应的操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shy好好学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值