首页 > 解决方案 > 如何在 SecurityConfig.java 中使用 setter 而不是 New JWTAuthenticationFilter

问题描述

我正在使用 spring-boot (使用 JWT 和 spring security ),并且我在 spring-boot 中有一个类 configSecurity ,代码如下:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.authorizeRequests().antMatchers("/login/**").permitAll();
        http.authorizeRequests().antMatchers(HttpMethod.GET,"/ListProjects/**").hasAuthority("ADMIN");
        http.authorizeRequests().anyRequest().authenticated()
                .and()
                .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint());
        http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll(); //allow CORS option calls
       http.addFilter(new JWTAuthenticationFilter(authenticationManager()));
 http.addFilterBefore(new JWTAutorizationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

还有一个类:JWTAuthenticationFilter.java,它包含了contsructor:

 @Autowired
 public JWTAuthenticationFilter(AuthenticationManager authenticationManager)
  {
      this.authenticationManager = authenticationManager;
  }

我的目标是更改 securityConfig 中的行:

  http.addFilter(new JWTAuthenticationFilter(authenticationManager())); 

变成这样的东西:

http.addFilter(jwtAuthenticationFilter.SetJWTAuthenticationFilter(authenticationManager());

所以我在 SecurityConfig 类中添加了 Annocation @Autoweird 如下:

@Autowired
private JWTAuthenticationFilter jwtAuthenticationFilter;

所以我不知道如何在 JWTAuthenticationFilter.java 中制作这个方法,我做了这样的事情:

          @Autowired
          public JWTAuthenticationFilter SetJWTAuthenticationFilter(AuthenticationManager authenticationManager) {
          this.authenticationManager = authenticationManager;
          return  // (1)
       }

(1) :那么在这种情况下我应该返回什么?我不想使用类似 new JWTAuthenticationFilter () .. 的东西,知道吗?或者我没有以正确的方式这样做..?

编辑

添加这些更改后,我无法对用户进行身份验证,因此无法获取每个用户的令牌,我认为问题出在我添加的新类上,它实现了一个返回 null 的方法

 import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;

@Configuration
public class CustomAuthManager implements AuthenticationManager {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        return null;
    }


}

任何的想法 ??

标签: javaspringspring-bootjwt

解决方案


那部分代码

 @Autowired
 public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
      this.authenticationManager = authenticationManager;
  }

意味着如果您创建JWTAuthenticationFilter为 Spring 组件(不是通过调用newAuthenticationManager将自动自动装配到该类中,并且您不需要运行任何类型的设置器。

你的authenticationManager()方法是做什么的?如果你只是创建一个新@Bean的,AuthenticationManager你可能只是在一个单独的类中做它,它会自动自动连接到 JWTAuthenticationFilter.

可能的解决方案:
1.创建类:

@Configuration
public class CustomAuthManager implements AuthenticationManager {
...
}

2. 添加到SecurityConfig

@Autowired
private JWTAuthenticationFilter jwtAuthenticationFilter;

并使用http.addFilter(jwtAuthenticationFilter);
3。保持JWTAuthenticationFilter原样。


推荐阅读