最近用到一种前端模板技术:vue,在权限控制上没有用springSecurity。因此用拦截器和注解结合实现了权限控制。 实现如下: 1.1 定义权限常量 PermissionConstants.javapublic class PermissionConstants { public static final String ADMIN_PRODUCT_LIST = "admin_product_list"; public static final String ADMIN_PRODUCT_DETAIL = "admin_product_detail";
1.2 定义权限的注解 RequiredPermission.java* @description 与拦截器结合使用 验证权限 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RequiredPermission {
1.3 权限拦截器 SecurityInterceptor.javapublic class SecurityInterceptor implements HandlerInterceptor { private AdminUserService adminUserService; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (this.hasPermission(handler)) { // null == request.getHeader("x-requested-with") TODO 暂时用这个来判断是否为ajax请求 // 如果没有权限 则抛403异常 springboot会处理,跳转到 /error/403 页面 response.sendError(HttpStatus.FORBIDDEN.value(), "无权限"); private boolean hasPermission(Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; RequiredPermission requiredPermission = handlerMethod.getMethod().getAnnotation(RequiredPermission.class); if (requiredPermission == null) { requiredPermission = handlerMethod.getMethod().getDeclaringClass().getAnnotation(RequiredPermission.class); if (requiredPermission != null && StringUtils.isNotBlank(requiredPermission.value())) { // redis或数据库 中获取该用户的权限信息 并判断是否有权限 Set<String> permissionSet = adminUserService.getPermissionSet(); if (CollectionUtils.isEmpty(permissionSet) ){ return permissionSet.contains(requiredPermission.value()); public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
1.4 拦截器注入的配置 MVCConfig.javapublic class MVCConfig extends WebMvcConfigurerAdapter { public SecurityInterceptor securityInterceptor() { return new SecurityInterceptor(); public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(securityInterceptor()).excludePathPatterns("/static/*") .excludePathPatterns("/error").addPathPatterns("/**");
springboot中注入拦截器 这里说一下多拦截器的配置方式
最后强调一点:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址 http://localhost:8080/xs/myservlet 是不会被拦截器拦截的。并且不管是属于哪个Servlet 只要复合过滤器的过滤规则,过滤器都会拦截。 最后说明下,我们上面用到的 WebMvcConfigurerAdapter 并非只是注册添加拦截器使用,其顾名思义是做Web配置用的,它还可以有很多其他作用,通过下面截图便可以大概了解,具体每个方法都是干什么用的,留给大家自己研究(其实都大同小异也很简单)。
1.5 ProductController.java@RequestMapping("/product") // @PermissionConstants.ADMIN_PRODUCT_MANAGEMENT public class ProductController { @RequiredPermission(PermissionConstants.ADMIN_PRODUCT_LIST) // 权限注解 @RequestMapping("/detail") @RequiredPermission(PermissionConstants.ADMIN_PRODUCT_DETAIL) // 权限注解 @RequestMapping("/delete") 如果没有标记权限注解,则不会验证该请求的权限,如/product/delete 请求
|