gpt4 book ai didi

java - 如何在 SecurityConfig.java 中使用 setter 代替 New JWTAuthenticationFilter

转载 作者:行者123 更新时间:2023-11-30 06:10:15 25 4
gpt4 key购买 nike

我正在使用 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,其中包含构造函数:

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

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

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

像这样的事情:

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

所以我在 SecurityConfig 类中添加了注释 @Autoweird ,如下所示:

@Autowired
private JWTAuthenticationFilter jwtAuthenticationFilter;

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

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

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

编辑

添加这些更改后,我无法对用户进行身份验证,因此无法获取每个用户的 token ,我认为问题出在我添加的新类上,它实现了一个返回 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;
}


}

有什么想法吗?

最佳答案

那部分代码

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

意味着如果您将 JWTAuthenticationFilter 创建为 Spring 组件(不是通过调用 new),AuthenticationManager 将自动连接到该类中,并且您不需要运行任何类型的 setter 。

您的 authenticationManager() 方法正在做什么?如果您只是创建 AuthenticationManager 的新 @Bean,您可以在单独的类中执行它,它将自动连接到 JWTAuthenticationFilter

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

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

2.添加到SecurityConfig:

@Autowired
private JWTAuthenticationFilter jwtAuthenticationFilter;

并使用http.addFilter(jwtAuthenticationFilter);
3. 保持JWTAuthenticationFilter不变。

关于java - 如何在 SecurityConfig.java 中使用 setter 代替 New JWTAuthenticationFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50409649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com