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的查看权限看看是否通过?不通过
当然这只是一个思想,实际实战过程中可以添加的东西太多了