SpringBoot中如何进行鉴权呢?

重生 SpringBoot 发布时间:2024-01-04 22:16:20 阅读数:12650 1
下文笔者讲述SpringBoot实现鉴权的四种方法分享,如下所示

SpringBoot实现鉴权的实现思路

方式1:
   AOP

方式2:
   继承 Interceptor接口,编写拦截器

方式3:
   继承ArgumentResolver的方式

方式4;
   编写Filter
例:AOP

使用@Aspect声明一下切面类WhitelistAspect

在切面类内添加一个切点whitelistPointcut()
 此处不使用execution 全部拦截
   添加一个注解  @Whitelist
     被注解的方法才会校验白名单

在切面类中使用spring的AOP注解
  @Before声明一个通知方法 checkWhitelist() 在 Controller 方法被执行之前校验白名单。
@Aspect
public class WhitelistAspect {
    
 @Before(value = "whitelistPointcut() && @annotation(whitelist)")
 public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) {
     checkWhitelist();
     // 可使用 joinPoint.getArgs() 获取Controller方法的参数
     // 可以使用 whitelist 变量获取注解参数
 }

    
 @Pointcut("@annotation(com.java265.Whitelist)")
 public void whitelistPointCut() {
 }
}

======只需在Controller上添加 @Whitelist
   即可实现相应的拦截

方式2:Interceptor拦截器

Spring拦截器(Interceptor)
    拦截器用于在 Controller 内 Action 
      被执行前通过一些参数判断是否要执行此方法,要实现一个拦截器
       可以实现 Spring 的  HandlerInterceptor 接口。
例:
@Component
public class WhitelistInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
         Object handler) throws Exception {
        Whitelist whitelist = ((HandlerMethod) handler).getMethodAnnotation(Whitelist.class);
        // whitelist.values(); 通过 request 获取请求参数,通过 whitelist 变量获取注解参数
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
        Object handler, ModelAndView modelAndView) throws Exception {
  // 方法在Controller方法执行结束后执行
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
        Object handler, Exception ex) throws Exception {
  // 在view视图渲染完成后执行
    }
}

//启用拦截器还要显式配置它启用
//使用WebMvcConfigurerAdapter对它进行配置

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1);
        // 这里可以配置拦截器启用的 path 的顺序,在有多个拦截器存在时,任一拦截器返回 false 都会使后续的请求方法不再执行
    }
}

ArgumentResolver

参数解析器:
    是Spring提供的用于解析自定义参数的工具
     我们常用
      @RequestParam
       注解就有它的影子
        使用它
         我们可以将参数在进入Controller Action之前就组合成我们想要的样子
            Spring 会维护一个ResolverList
  当请求到达时
   Spring发现有自定义类型参数(非基本类型)
     会依次尝试这些Resolver
       直到有一个Resolver能解析需要的参数
        要实现一个参数解析器
         需要实现HandlerMethodArgumentResolver 接口。

实现AuthParamResolver类

@Component
public class AuthParamResolver implements HandlerMethodArgumentResolver {
 
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(AuthParam.class);
    }
 
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        Whitelist whitelist = parameter.getMethodAnnotation(Whitelist.class);
        // 通过 webRequest 和 whitelist 校验白名单
        return new AuthParam();
    }
}

//配置WebMvcConfigurerAdapter内配置

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {
 
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new AuthParamResolver());
    }
}

Filter

Filter并不是Spring提供
  它是在Servlet规范中定义
   是Servlet容器支持
   被Filter过滤的请求
    不会派发到Spring容器中
实现javax.servlet.Filter接口即可
 由于不在Spring容器中
   Filter获取不到Spring容器的资源
    只能使用原生Java的ServletRequest和ServletResponse来获取请求参数
     另外,在一个Filter中要显示调用FilterChain的doFilter方法
 
public class WhitelistFilter implements javax.servlet.Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
  // 初始化后被调用一次
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
     // 判断是否需要拦截
       chain.doFilter(request, response); // 请求通过要显示调用
    }
 
    @Override
    public void destroy() {
     // 被销毁时调用一次
    }
}

//Filter 也需要显示配置:

@Configuration
public class FilterConfiguration {
 
    @Bean
    public FilterRegistrationBean someFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new WhitelistFilter());
        registration.addUrlPatterns("/*");
        registration.setName("whitelistFilter");
        registration.setOrder(1); // 设置过滤器被调用的顺序
        return registration;
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202401/7624.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者