springboot的权限控制可以用Shiro或者Spring Security,但是原生的拦截器同样可以实现这一功能。
现在我们通过自定义注解来实现一个角色权限验证的功能。有关springboot自定义注解的一般方法见我的博客《springboot自定义注解的实现方式》
1. 定义接口
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCheck {
String[] value() default {};
String[] authorities() default {};
}
2. 定义拦截器
public class MyCheckAspect implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler; //获得方法处理器
// 取出要调用的方法
Method method = handlerMethod.getMethod();
// 获取出方法上的MyCheck注解
MyCheck annotation = method.getAnnotation(MyCheck.class);
if (annotation == null) {
// 如果注解为null, 说明不需要拦截, 可以执行后续函数
return true;
}
if (annotation.authorities().length > 0) {
String[] authorities = annotation.authorities();
Set<String> authSet = new HashSet<>();
for (String authority : authorities) {
// 将权限加入一个set集合中
authSet.add(authority);
}
String role = "xinxin"; //为测试方便,直接定义角色为"xnxin"
if (StringUtils.isNotBlank(role)) {
if (authSet.contains(role)) {
// 验证通过返回true, 否则拦截请求
return true;
}
}
}
return false; //不返回任何结果,不执行后续函数
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3. 注册拦截器
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCheckAspect()).addPathPatterns("/**");
}
}
4. 指定方法上添加自定义注解
@GetMapping
@MyCheck(authorities = {"admin"}) //指定admin才能执行该函数
public ResponseEntity<Object> query(MyJobQueryCriteria criteria,Pageable pageable){
return new ResponseEntity<>(myJobService.queryAll(criteria,pageable),HttpStatus.OK);
}
运行结果显示,xinxin 不等于 admin 没有权限,函数不能执行!