权限控制(Interceptor拦截器)

1查出loginUser的所有权限放置session里 

2在对应需要权限的API接口自定义注解标识

3配置Interceptor在preHandle方法做前置判断

自定义注解
 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RoleCheck {
  public String item();

  public String promissonType();
}

编写拦截器(这里其实也可以用AOP实现)

@Component
public class UserRoleCheckInterceptor implements HandlerInterceptor {
    //前置拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
      if (handler instanceof HandlerMethod){
          HandlerMethod handlerMethod = (HandlerMethod) handler;
          //获取注解内容
          RoleCheck rc=handlerMethod.getMethodAnnotation(RoleCheck.class);
          if (rc==null){
              return false;
          }
          //获取session内容
          HttpSession session =request.getSession();
          if (session!=null){
              Login login=(Login)session.getAttribute(session.getId());
              //进行比较看是否有权限
              Optional<PermissonDto> dd=login.getPermissonDtos().stream().filter(k->k.getItem().equals(rc.item()))
                      .filter(K->K.getPermissonType().equals(rc.promissonType())).findFirst();
              if (!dd.isPresent()){
                  return false;
              }
          }
      }
        return true;
    }

}

配置类(这里稍微注意一下,之前的WebMvcConfigurerAdapter已经无效,建议实现WebMvcConfigurer )

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private UserRoleCheckInterceptor userRoleCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userRoleCheckInterceptor).addPathPatterns("/per/ex").addPathPatterns("/per/px");
    }
}

编写controller

关于登录校验这块是写死的,真正的工程不可能这么写
顺便说一下登录校验的思路:
首先是一个loginUser进来,去数据库查这个user是否存在,存在的话把他的信息拿到(例如,角色,id,地址...)
其次再根据对应的角色去表里查对应的权限放在放在list里面

@RestController
@RequestMapping("/per")
public class PromissonCheckController {
    //编辑权限(init模块的编辑权限)
    @RoleCheck(item="init",promissonType = "update")
    @PostMapping(value="/ex")
    public String updateCheckUserPro(@RequestBody String userId){return "successfully";}

    //查看权限(init模块的查看权限)
    @RoleCheck(item="init",promissonType = "query")
    @PostMapping(value="/px")
    public String queryCheckUserPro(@RequestBody String userId){
        return "successfully";
    }

    //登录校验
    @PostMapping(value="/pl")
    public String loginin(HttpServletRequest request, HttpServletResponse response){
        HttpSession session=request.getSession();
        Login login =new Login();
        //↓这一部分写死 实际情况应该是去查数据库,查看对应的userid对应的角色以及权限
        List<PermissonDto> ddlist =new ArrayList<>();
        PermissonDto dd =new PermissonDto();
        dd.setItem("init");
        dd.setPermissonType("update");
        login.setId("123");
        ddlist.add(dd);
        //↑
        login.setPermissonDtos(ddlist);
        session.setAttribute(session.getId(),login);
        return "successfully";
    }


}

测试:

首先先模拟登录校验将信息存在session里

 这块写死的是(这个用户拥有init模块的编辑权限)

postman进入init的编辑权限看看是否通过?通过

 postman进入init的查看权限看看是否通过?不通过

 当然这只是一个思想,实际实战过程中可以添加的东西太多了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值