广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的SpringSecurity配置过滤器
  • 308
分享到

Java中的SpringSecurity配置过滤器

2024-04-02 19:04:59 308人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录AbstractAuthenticationFilterConfigurer改造过程配置类效果前言: CaptchaAuthenticationFilter是通过模仿Userna

前言:

CaptchaAuthenticationFilter是通过模仿UsernamePassWordAuthenticationFilter实现的。同样的道理,由于UsernamePasswordAuthenticationFilter的配置是由FORMLoginConfigurer来完成的,应该也能模仿一下FormLoginConfigurer,写一个配置类CaptchaAuthenticationFilterConfigurer去配置CaptchaAuthenticationFilter

public final class FormLoginConfigurer<H extends httpsecurityBuilder<H>> extends
		AbstractAuthenticationFilterConfigurer<H, FormLoginConfigurer<H>, UsernamePasswordAuthenticationFilter> {
 
    // 省略
}    

AbstractAuthenticationFilterConfigurer

FormLoginConfigurer看起来有点复杂,不过继承关系并不复杂,只继承了AbstractAuthenticationFilterConfigurer

public abstract class AbstractAuthenticationFilterConfigurer<B extends HttpSecurityBuilder<B>, T extends AbstractAuthenticationFilterConfigurer<B, T, F>, F extends AbstractAuthenticationProcessingFilter>
		extends AbstractHttpConfigurer<T, B> {
}    

理论上我们模仿一下,也继承一下这个类,但是你会发现这种方式行不通。因为AbstractAuthenticationFilterConfigurer只能Spring Security内部使用,不建议自定义。原因在于它最终向HttpSecurity添加过滤器使用的是HttpSecurity.addFilter(Filter)方法,这个方法只有内置过滤器(参见FilterOrderReGIStration)才能使用。了解了这个机制之后,我们只能往上再抽象一层,去改造其父类AbstractHttpConfigurer

改造过程

AbstractAuthenticationFilterConfigurer<B,T,F>中的B是实际指的HttpSecurity,因此这个要保留;

T指的是它本身的实现,我们配置CaptchaAuthenticationFilter不需要下沉一层到FormLoginConfigurer这个继承级别,直接在AbstractAuthenticationFilterConfigurer这个继承级别实现即可,因此T这里指的就是需要配置类本身,也不需要再抽象化,因此是不需要的;同样的原因F也不需要,很明确是CaptchaAuthenticationFilter,不需要再泛化。这样CaptchaAuthenticationFilter的配置类结构可以这样定义:

public class CaptchaAuthenticationFilterConfigurer<H extends HttpSecurityBuilder<H>> extends AbstractHttpConfigurer<CaptchaAuthenticationFilterConfigurer<H>, H> {
    // 不再泛化  具体化 
    private final CaptchaAuthenticationFilter authFilter;
    // 特定的验证码用户服务
    private CaptchaUserDetailsService captchaUserDetailsService;
    // 验证码处理服务
    private CaptchaService captchaService;
    // 保存认证请求细节的策略 
    private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource;
    // 默认使用保存请求认证成功处理器 
    private SavedRequestAwareAuthenticationSuccesshandler defaultSuccessHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    // 认证成功处理器
    private AuthenticationSuccessHandler successHandler = this.defaultSuccessHandler;
     // 登录认证端点
    private LoginUrlAuthenticationEntryPoint authenticationEntryPoint;
    // 是否 自定义页面 
    private boolean customLoginPage;
    // 登录页面
    private String loginPage;
    // 登录成功url
    private String loginProcessingUrl;
    // 认证失败处理器
    private AuthenticationFailureHandler failureHandler;
    // 认证路径是否放开
    private boolean permitAll;
    //  认证失败的url
    private String failureUrl;

    
    public CaptchaAuthenticationFilterConfigurer() {
        setLoginPage("/login/captcha");
        this.authFilter = new CaptchaAuthenticationFilter();
    }
    public CaptchaAuthenticationFilterConfigurer<H> formLoginDisabled() {
        this.formLoginEnabled = false;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaUserDetailsService(CaptchaUserDetailsService captchaUserDetailsService) {
        this.captchaUserDetailsService = captchaUserDetailsService;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaService(CaptchaService captchaService) {
        this.captchaService = captchaService;
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> usernameParameter(String usernameParameter) {
        authFilter.setUsernameParameter(usernameParameter);
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> captchaParameter(String captchaParameter) {
        authFilter.setCaptchaParameter(captchaParameter);
        return this;
    }
    public CaptchaAuthenticationFilterConfigurer<H> parametersConverter(Converter<HttpServletRequest, CaptchaAuthenticationToken> converter) {
        authFilter.setConverter(converter);
        return this;
    }
    @Override
    public void init(H http) throws Exception {
        updateAuthenticationDefaults();
        updateAccessDefaults(http);
        registerDefaultAuthenticationEntryPoint(http);
        // 这里禁用默认页面过滤器 如果你想自定义登录页面 可以自行实现 可能和FormLogin冲突
        // initDefaultLoginFilter(http);
        // 把对应的Provider也在init时写入HttpSecurity
        initProvider(http);
    }
     @Override
    public void configure(H http) throws Exception {
        //这里改为使用前插过滤器方法
         http.addFilterBefore(filter, LoGoutFilter.class);
    }
     // 其它方法 同AbstractAuthenticationFilterConfigurer
}  

其实就是模仿AbstractAuthenticationFilterConfigurer及其实现类的风格把用的配置项实现一边。这里值得一提的是CaptchaService的配置也可以从Spring IoC中查找(参考getBeanOrNull方法,这个方法在spring Security中随处可见,建议借鉴),这样更加灵活,既能从方法配置也能自动注入。

    private void initProvider(H http) {
        ApplicationContext applicationContext = http.getSharedObject(ApplicationContext.class);
        // 没有配置CaptchaUserDetailsService就去Spring ioc获取
        if (captchaUserDetailsService == null) {
            captchaUserDetailsService = getBeanOrNull(applicationContext, CaptchaUserDetailsService.class);
        }
        // 没有配置CaptchaService就去Spring IoC获取
        if (captchaService == null) {
            captchaService = getBeanOrNull(applicationContext, CaptchaService.class);
        } 
        // 初始化 Provider
        CaptchaAuthenticationProvider captchaAuthenticationProvider = this.postProcess(new CaptchaAuthenticationProvider(captchaUserDetailsService, captchaService));
        // 会增加到ProviderManager的注册列表中
        http.authenticationProvider(captchaAuthenticationProvider);
    }

配置类效果

我们来看看CaptchaAuthenticationFilterConfigurer的配置效果:

    @Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http, UserDetailsService userDetailsService) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .mvcMatchers("/foo/**").access("hasAuthority('ROLE_USER')")
                .anyRequest().authenticated()
                .and()
                // 所有的 AbstractHttpConfigurer 都可以通过apply方法加入HttpSecurity
                .apply(new CaptchaAuthenticationFilterConfigurer<>())
                // 配置验证码处理服务   这里直接true 方便测试
                .captchaService((phone, rawCode) -> true)
                // 通过手机号去拿验证码,这里为了方便直接写死了,实际phone和username做个映射  
                .captchaUserDetailsService(phone -> userDetailsService.loadUserByUsername("felord"))
                // 默认认证成功跳转到/路径  这里改造成把认证信息直接返回JSON
                .successHandler((request, response, authentication) -> {
                // 这里把认证信息以jsON形式返回
                    ServletServerHttpResponse servletServerHttpResponse = new ServletServerHttpResponse(response);
                    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
                           mappingJackson2HttpMessageConverter.write(authentication, MediaType.APPLICATION_JSON,servletServerHttpResponse);
                });
        return http.build();
    }

是不是要优雅很多,解决了你自己配置过滤器的很多疑难杂症。学习一定要模仿,先模仿成功,然后再分析思考为什么会模仿成功,最后形成自己的创造力。千万不要被一些陌生概念唬住,有些改造是不需要去深入了解细节的。

到此这篇关于Java中的Spring Security配置滤器的文章就介绍到这了,更多相关Spring Security过滤器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中的SpringSecurity配置过滤器

本文链接: https://www.lsjlt.com/news/149465.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的SpringSecurity配置过滤器
    目录AbstractAuthenticationFilterConfigurer改造过程配置类效果前言: CaptchaAuthenticationFilter是通过模仿Userna...
    99+
    2022-11-13
  • SpringSecurity的过滤器链机制
    目录前言请求执行链路推荐阅读 前言 在“码农小胖哥”的文章中提到一个关键的过滤器链SecurityFilterChain,当一个请求 HttpServletR...
    99+
    2022-11-13
    Spring Security过滤器链 Spring Security过滤器链机制
  • java过滤器中Filter的ChainFilter过滤链
    在Java过滤器中,FilterChain是一种过滤链,用于按照一定顺序依次调用多个过滤器对请求进行处理。FilterChain接口定义了一个doFilter方法,该方法接受ServletRequest和ServletResponse作...
    99+
    2023-08-11
    java
  • java配置多个过滤器优先级以及几个常用过滤器操作
    目录过滤器配置:常用过滤器之一:常用过滤器之二:敏感词过滤工具类一个项目中不出意外的话会有两个以上的过滤器,但是直接不配置的话他会按照你的过滤器名字排序执行,这样的话可能会导致一些性...
    99+
    2022-11-12
  • Java CharacterEncodingFilter过滤器的理解和配置案例详解
    在web项目中我们经常会遇到当前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题,这些问题的原因就是因为我们...
    99+
    2022-11-12
  • java配置多个过滤器优先级是什么
    这篇文章主要为大家展示了“java配置多个过滤器优先级是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java配置多个过滤器优先级是什么”这篇文章吧。过滤器配置:package c...
    99+
    2023-06-20
  • SpringSecurity定义多个过滤器链的操作代码
    简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。一般来说中大型的项...
    99+
    2023-05-17
    SpringSecurity多个过滤器链 SpringSecurity过滤器链
  • spring boot 配置Filter过滤器的方法
    Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter首先要准备一个实现了Filter的接口的类 SessionFilter:import org.slf4j...
    99+
    2023-05-31
    spring boot 配置
  • SpringBoot中shiro过滤器重写与配置的方法
    本篇内容介绍了“SpringBoot中shiro过滤器重写与配置的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题遇到问题:在前后端分...
    99+
    2023-06-30
  • SpringBoot中shiro过滤器的重写与配置详解
    目录问题解决方案实现代码1.重写shiro 登录 过滤器2.重写role权限 过滤器3.配置过滤器问题 遇到问题:在前后端分离跨域访问的项目中shiro进行权限拦截失效 (即使有正确...
    99+
    2022-11-13
  • JAVA中的拦截器、过滤器
    JAVA变成拦截器、过滤器 一、拦截器1、简介说明2、源码及方法说明3、拦截器自定义应用 二、过滤器1、简介说明2、源码及方法说明3、过滤器的自定义应用 三、Springboot中的WebMvcConfigurer1、简介2...
    99+
    2023-08-19
    java servlet 开发语言
  • Redis中布隆过滤器如何安装和配置
    这篇文章给大家分享的是有关Redis中布隆过滤器如何安装和配置的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、版本要求推荐版本6.x,最低4.x版本,可以通过如下命令查看版本:...
    99+
    2022-10-18
  • HBase内置过滤器java api的知识点总结
    这篇文章主要介绍“HBase内置过滤器java api的知识点总结”,在日常操作中,相信很多人在HBase内置过滤器java api的知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HBase内置过滤...
    99+
    2023-06-19
  • Java中使用Filter过滤器的方法
    Filter过滤器 着重记录下 public void doFilter(){} 方法参数: (1) ServletRequest servletRequest  请求re...
    99+
    2022-11-12
  • 阿里云日志服务日志过滤器配置
    日志收集流程 对于日志收集的客户端,其work pipeline通常包括三个过程:Input,Process,Output。 Input: 适配各类日志接入源,目前Logtail支持...
    99+
    2022-11-13
  • vue中内置过滤器怎么用
    小编给大家分享一下vue中内置过滤器怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言vue中过滤器filters的作用是...
    99+
    2022-10-19
  • java中的监听器和过滤器是什么
    本篇内容介绍了“java中的监听器和过滤器是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录介绍:作用域对象:Servt规范扩展---...
    99+
    2023-06-20
  • java中filter过滤器的作用有哪些
    在Java中,filter过滤器主要用于对集合或流中的元素进行条件过滤,只保留满足特定条件的元素。它的主要作用包括: 过滤元素:...
    99+
    2023-10-24
    java filter
  • java中filter过滤器的用法是什么
    在Java中,过滤器(Filter)是一种用于在请求到达目标资源之前或之后执行某些操作的组件。过滤器可以用于实现对请求的拦截、修改或...
    99+
    2023-10-11
    java
  • 网关GateWay的使用详解、路由、过滤器、跨域配置
    网关GateWay的使用详解、路由、过滤器、跨域配置 一、网关的基本概念 SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发)路由和负载均...
    99+
    2023-09-07
    gateway java spring cloud 分布式 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作