Rumah  >  Artikel  >  Java  >  Cara Springboot melaksanakan pengesahan Pengesahan universal

Cara Springboot melaksanakan pengesahan Pengesahan universal

王林
王林ke hadapan
2023-05-14 11:31:051121semak imbas

AOP Tradisional

Untuk keperluan ini, perkara pertama yang terlintas di fikiran sudah tentu antara muka AOP yang disediakan oleh Spring-boot Anda hanya perlu menambah titik sebelum kaedah Pengawal, dan kemudian memprosesnya potong mata.

Laksanakan

dan langkah penggunaannya adalah seperti berikut:

  1. Gunakan @Aspect untuk mengisytiharkan kelas aspek WhitelistAspect

  2. Gunakan anotasi AOP spring @Sebelum dalam kelas aspek untuk mengisytiharkan kaedah pemberitahuan checkWhitelist() untuk mengesahkan senarai putih sebelum kaedah Pengawal dilaksanakan.

  3. Pseudokod kelas aspek adalah seperti berikut:

  4.  @Aspect
      public class WhitelistAspect {
    
        @Before(value = "whitelistPointcut() && @annotation(whitelist)")
        public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) {
            checkWhitelist();
            // 可使用 joinPoint.getArgs() 获取Controller方法的参数
            // 可以使用 whitelist 变量获取注解参数
        }
    
        @Pointcut("@annotation(com.zhenbianshu.Whitelist)")
        public void whitelistPointCut() {
        }
      }
Tambah anotasi @Whitelist pada kaedah Pengawal untuk melaksanakan fungsi.


Sambungan

Dalam contoh ini, anotasi digunakan untuk mengisytiharkan pemotongan titik dan saya melaksanakan parameter anotasi untuk mengisytiharkan senarai putih untuk disahkan Jika senarai putih lain perlu ditambah kemudian, Jika senarai itu disahkan oleh UID, anda boleh menambah kaedah seperti uid() pada anotasi ini untuk melaksanakan pengesahan tersuai.


Selain itu, AOP spring juga menyokong kaedah pengisytiharan pointcut seperti pelaksanaan (kaedah pelaksanaan), bean (kaedah pelaksanaan objek Bean yang sepadan dengan nama tertentu) dan @Around (dilaksanakan dalam pelaksanaan sasaran function), @After (selepas pelaksanaan kaedah) dan kaedah pemberitahuan lain.


Jadi, fungsi telah dilaksanakan, tetapi ketua tidak berpuas hati =_= Sebabnya AOP telah digunakan terlalu banyak dan disalahgunakan dalam projek . Nah, saya hanya perlu memulakannya. Juga beri perhatian kepada: Lajur Teknologi Ma Yuan, balas di latar belakang: "Panduan Temu Bual" boleh diperolehi, versi terkini PDF definisi tinggi 3625 muka surat soalan temuduga untuk syarikat Internet utama.


Pemintas


Pemintas Spring juga sangat sesuai untuk melaksanakan fungsi ini. Seperti namanya, pemintas digunakan untuk menentukan sama ada untuk melaksanakan kaedah ini melalui beberapa parameter sebelum Tindakan dalam Pengawal dilaksanakan Untuk melaksanakan pemintas, anda boleh melaksanakan antara muka HandlerInterceptor Spring.

Pelaksanaan


Langkah pelaksanaan adalah seperti berikut:


Tentukan kelas pemintas AppkeyInterceptor dan laksanakan antara muka HandlerInterceptor.

  1. melaksanakan kaedah preHandle()nya;

  2. menentukan sama ada permintaan perlu dipintas melalui anotasi dan parameter dalam kaedah praHandle permintaan, antara muka mengembalikan palsu;

  3. Daftarkan pemintas ini dalam kelas WebMvcConfigurerAdapter tersuai; >

    @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视图渲染完成后执行
        }
    }
  4. Sambungan
  5. Untuk mendayakan pemintas, anda perlu mengkonfigurasinya secara eksplisit Di sini kami menggunakan WebMvcConfigurerAdapter untuk mengkonfigurasinya. Perlu diingat bahawa MvcConfiguration yang mewarisinya perlu berada dalam laluan ComponentScan.
@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1);
        // 这里可以配置拦截器启用的 path 的顺序,在有多个拦截器存在时,任一拦截器返回 false 都会使后续的请求方法不再执行
    }
}

Juga ambil perhatian bahawa selepas pemintas berjaya dilaksanakan, kod respons ialah 200, tetapi data respons kosong.
Selepas menggunakan pemintas untuk melaksanakan fungsi, ketua akhirnya menghasilkan helah besar: kita sudah mempunyai parameter Auth, kunci apl boleh diperolehi daripada parameter Auth, dan kehadiran atau ketiadaan senarai putih boleh digunakan sebagai kaedah Auth. Mengapa tidak mengesahkan semasa Auth? emmm... Muntah darah.


ArgumentResolver

Penghurai parameter ialah alat yang disediakan oleh Spring untuk menghuraikan parameter tersuai kami yang biasa digunakan menggunakan bayangannya, kita boleh Parameter digabungkan menjadi apa yang kita mahukan sebelum memasuki Tindakan Pengawal. Spring akan mengekalkan ResolverList Apabila permintaan tiba, Spring mendapati bahawa terdapat parameter jenis tersuai (jenis bukan asas), dan akan mencuba Penyelesai ini dalam urutan sehingga Penyelesai boleh menghuraikan parameter yang diperlukan. Untuk melaksanakan penyelesai parameter, anda perlu melaksanakan antara muka HandlerMethodArgumentResolver.

Pelaksanaan

Tentukan jenis parameter tersuai AuthParam, terdapat medan berkaitan appkey dalam kelas; AuthParamResolver Dan laksanakan antara muka HandlerMethodArgumentResolver; kaedah untuk menyelesaikan Objek reqest menjana objek AuthParam dan mengesahkan AuthParam di sini untuk mengesahkan sama ada kunci aplikasi berada dalam senarai putih


Tambah parameter AuthParam dalam tandatangan kaedah Tindakan Pengawal; untuk membolehkan Penyelesai ini;

  • Kelas AuthParamResolver yang dilaksanakan adalah seperti berikut:

    @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();
        }
    }
  • Sambungan
  • Sudah tentu, menggunakan parser parameter juga perlu dikonfigurasikan secara berasingan, kita juga perlu Configuration dalam WebMvcConfigurerAdapter:
  • @Configuration
    public class MvcConfiguration extends WebMvcConfigurerAdapter {
    
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(new AuthParamResolver());
        }
    }

    Kali ini pelaksanaan selesai, saya masih agak bimbang, jadi saya mencari dalam talian untuk melihat sama ada terdapat cara lain untuk mencapai fungsi ini, dan mendapati bahawa Penapis adalah yang biasa.

  • 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;
        }
    }

Atas ialah kandungan terperinci Cara Springboot melaksanakan pengesahan Pengesahan universal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam