无法通过 @Autowired 将 AuthenticationManager 传递给自定义过滤器

2023-12-01

我正在尝试通过 @Autowired 注释将过滤器 JWTLoginFilter 传递给 WebSecurityConfig WebSecurityConfigurerAdapter 。当 JWTLoginFilter 尝试从 WebSecurityConfig 获取 AuthenticationManager 时,就会出现问题。

当我启动服务器时,出现以下错误:

描述:

应用程序上下文中一些bean的依赖关系形成 一个周期:

文件中定义的 JWTLoginFilter [C:\Users\user\workspace\backend\target\classes\pl\dn\schoolsystem\service\jwt\JWTLoginFilter.class]

webSecurityConfig(字段 pl.dn.schoolsystem.service.jwt.JWTLoginFilter pl.dn.schoolsystem.config.WebSecurityConfig.jwtLoginFilter)

错误图像

我认为这是循环依赖注入。我被困在这个问题上,我不知道如何解决。

网络安全配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private Environment env;

    @Autowired
    private UserSecurityService userSecurityService;

    @Autowired
    JWTLoginFilter jwtLoginFilter;

    private static final String Salt = "salt"; // should be protected better

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12, new SecureRandom(Salt.getBytes()));
    }

    @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
       @Override
       public AuthenticationManager authenticationManagerBean() throws Exception {
           return super.authenticationManagerBean();
       }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().
        authorizeRequests().antMatchers("/").permitAll()
        .antMatchers(HttpMethod.POST, "/login").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()

        .and()

        //.addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), 
                //UsernamePasswordAuthenticationFilter.class)
        .addFilterBefore(jwtLoginFilter, 
                UsernamePasswordAuthenticationFilter.class)
        .addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);        
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userSecurityService).passwordEncoder(passwordEncoder());
    }

}

JWT登录过滤器:

@Component
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter{

    @Autowired
    UserService userService;

    @Autowired
    public JWTLoginFilter(@Value("/login") String url, AuthenticationManager authManager) {
        super(new AntPathRequestMatcher(url));
        setAuthenticationManager(authManager);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
            HttpServletResponse res) throws AuthenticationException,
            IOException, ServletException {

        System.out.println("Jestem w JwtLogginFilter.attemptAuthentication -------------------------------------");

        AccountCredentials creds = new ObjectMapper()
            .readValue(req.getInputStream(), AccountCredentials.class);

        User user = userService.findByUsername(creds.getUsername());

        return getAuthenticationManager().authenticate(
                new UsernamePasswordAuthenticationToken(
                        creds.getUsername(),
                        creds.getPassword(),
                        user.getAuthorities()
                        )
        );
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request,
            HttpServletResponse response, FilterChain chain,
            Authentication authResult) throws IOException, ServletException {

        System.out.println("Jestem w JWTLogginFilter.successfulAuthentication -------------------------------------- ");

        System.out.println("authResult.getName(): " + authResult.getName());
        TokenAuthenticationService.addAuthentication(response, authResult.getName());

    }



}

我正在使用 Spring Boot 1.5.4。感谢您的建议


Your WebSecurityConfig明确要求JWTLoginFilter注入其中,并且JWTLoginFilter要求AuthenticationManager被注入到它的构造函数中。AuthenticationManager是由提供WebSecurityConfig,所以你有一个循环依赖。

Remove @Component注释来自JWTLoginFilter并将过滤器定义为一个 beanWebSecurityConfig:

@Bean
public JWTLoginFilter jwtLoginFilter() {
    return new JWTLoginFilter("/login", authenticationManager());
}

您可能还需要注入UserService在此方法中手动(例如,通过构造函数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法通过 @Autowired 将 AuthenticationManager 传递给自定义过滤器 的相关文章

随机推荐

  • React + Redux - 在哑组件中调度一个动作?

    我开始学习 Redux 整个想法看起来很简洁 但是在将我的 React 应用程序从 正常 重建为 redux way 后 这个问题出现了 我有一个基于异步调用的 JSON 构建的 if 项目列表 然后该列表中的每个项目都会在单击时发送异步调
  • JavaScript 递归将列表格式从 XML 转换为 HTML

    我有一个练习 要求我使用递归将 XML 数据输出到 HTML 列表标记中 可耻地承认我在数学方面的缺点 我希望有人向我展示如何使用 JavaScript 对 XML 的 节点结构 实现递归逻辑 结果如下 JSFiddle EDIT添加了示例
  • 如何使用缺少今天构建的列表在 iTunesConnect 中创建“构建”记录?

    Problem 显然 iTunesConnect 希望我通过选择最近的构建来创建 构建 记录 但今天的构建没有出现 Details 首先我选择Product gt Build在 Xcode 5 1 1 中 我转到 MyApps 下的 iTu
  • 如何访问 Angular2 新的路由器查询字符串

    我怎样才能访问querystring我的组件的参数 我有这样的网址 http myurl com myroute myparam 1 thanks HintRC 1 angular router也已弃用 最好坚持 angular route
  • R:是否有与 Stata 的 codebookout 命令等效的命令?

    在 Stata 中我可以使用codebookout命令创建一个 Excel 工作簿 保存现有数据集中所有变量的名称 标签和存储类型及其相应的值和值标签 我想在 R 中找到一个等效的函数 到目前为止 我遇到过memisc库有一个名为codeb
  • 自动透视校正 OpenCV

    我正在尝试在我的 iOS 程序中实现自动透视校正 当我使用教程中发现的测试图像时 一切都会按预期进行 但是当我拍照时 我得到了一个奇怪的结果 我正在使用在此找到的代码tutorial 当我给它一个看起来像这样的图像时 我得到这个结果 这是什
  • Laravel - 使用多个关键字对多个列进行搜索,搜索结果将按相关性排序

    我正在尝试在 Laravel 中实现搜索 它将有一个搜索栏 其中将给出 3 个关键字作为输入 有 2 列 即meta name and meta description在将进行搜索的数据库中 假设搜索词是word1 word2 word3
  • 在类方法上使用 property()

    我有一个包含两个类方法的类 使用classmethod 函数 用于获取和设置本质上是静态变量的内容 我尝试使用property 函数与这些 但它会导致错误 我能够在解释器中使用以下命令重现该错误 class Foo object var 5
  • Xdebug 已安装,但未显示在 Xampp 的 Phpinfo 中

    我在 Mac Mountain Lion OS X 10 8 2 上安装了最新的 Xampp 和 Php 5 3 我刚刚安装了 Xdebug 并在 php ini 中配置它 我从下载this链接并按照说明进行操作 还将以下条目放入 php
  • 同步不同类(和不同包)中的两个方法

    我遇到了有关 Java 方法同步的问题 希望我能简要解释一下 我在两个不同的类 两个不同的包中有两种不同的方法 就像是 Package1 Class1 MethodA Package2 Class2 MethodB 好的 那么现在我需要同步
  • C++ 内存编辑 - 编辑汇编/写入字节

    在地址 10134CE0 我有 10134CE0 40 inc eax 我怎样才能改变这个 希望使用C WriteProcessMemory 来做到这一点 dec eax 我知道40意味着inc eax48 意味着dec eax但是我怎样才
  • SAPUI5中的语言切换

    我的 SAPUI5 控件存在语言问题 如果我执行例如 sap ui getCore getConfiguration setLanguage de 我的 i18n 文件已正确加载 所有标签均已翻译为德语 但控件仍然是英文的 获取德语控件的唯
  • 如何在for循环中打印一行中没有空格的字符串

    我想知道如何在一行中打印 for 循环中的一些字符串 而彼此之间没有空格 我知道在一行中连接没有空格的字符串 但在 for 循环之外 gt gt gt print hi hi hi hihihi 但是 我不知道如何在 for 循环中做到这一
  • MVC5视图下拉列表

    在 C MVC5 Internet 应用程序视图中 如何显示下拉列表以供用户选择从View Model list 这里是ViewModel code public class MapLocationItemViewModel Editabl
  • 明显的 F#/BCL 浮点错误

    以下是 FSI 中的内容 gt System Math Round 0 2916 2 val it float 0 29 gt it 100 val it float 29 0 gt int it val it int 28 我尝试过的任何
  • 如何在 Rust 中不阻塞地读取子进程的输出?

    我正在 Rust 中制作一个小型 ncurses 应用程序 需要与子进程通信 我已经有了一个用 Common Lisp 编写的原型 我正在尝试重写它 因为 CL 对于如此小的工具使用大量内存 我在弄清楚如何与子流程交互时遇到一些麻烦 我目前
  • WPF 网页浏览器的 LoadCompleted 事件

    WPF Web 浏览器的 LoadCompleted 事件何时触发 此事件是否等待 aspx 页面中的任何 ajax 调用完成 我有一个 wpf 应用程序 其中将网页浏览器控件放置在窗口窗体上 并使用导航方法加载网页 即使某些 ajax 调
  • 如何在 uiviewcontroller 中的窗口上添加视图

    是否可以从 uiviewcontroller 在窗口上添加子视图 然后将其删除 谢谢 潘卡伊 不明白你的意思 self view addSubview yoursubview yoursubview removeFromSuperview
  • 从 CDbCriteria 获取字符串表示形式

    有什么方法可以从中获取查询的字符串表示形式CDb标准 用于测试和调试目的 您可以使用日志记录和分析来配置 main php 如下所示 components gt array log gt array class gt CLogRouter
  • 无法通过 @Autowired 将 AuthenticationManager 传递给自定义过滤器

    我正在尝试通过 Autowired 注释将过滤器 JWTLoginFilter 传递给 WebSecurityConfig WebSecurityConfigurerAdapter 当 JWTLoginFilter 尝试从 WebSecur