Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个_Java_Spring_Spring Boot_Jwt_Components - Fatal编程技术网

Java com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个

Java com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个,java,spring,spring-boot,jwt,components,Java,Spring,Spring Boot,Jwt,Components,完全错误: com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个: user1:在文件[/tools/tomcat/instances/webapps/api/WEB-INF/classes/com/api/jwt/users/test1.class]中定义 user2:在文件[/tools/tomcat/instances/webapps/api/WEB-INF/classes/com/api/jwt/users/t

完全错误: com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个:

  • user1:在文件[/tools/tomcat/instances/webapps/api/WEB-INF/classes/com/api/jwt/users/test1.class]中定义
  • user2:在文件[/tools/tomcat/instances/webapps/api/WEB-INF/classes/com/api/jwt/users/test2.class]中定义
我有以下课程:

Test1.java

@Service
@Component("user1")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("user2")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    @Qualifier(value = "user1")
    private Test1 test1;

    @Autowired
    @Qualifier(value = "user2")
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
@Service
@Component("myUserDetailsService")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("myUserDetailsService")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier(value = "myUserDetailsService")
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private Test1 test1;

    @Autowired
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
JwtRequestFilter.java

@Service
@Component("user1")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("user2")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    @Qualifier(value = "user1")
    private Test1 test1;

    @Autowired
    @Qualifier(value = "user2")
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
@Service
@Component("myUserDetailsService")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("myUserDetailsService")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier(value = "myUserDetailsService")
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private Test1 test1;

    @Autowired
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
我认为通过使用
@Component
@Qualifier
,我可以设置两个用户详细信息类,但事实似乎并非如此

在这个设计中,我是否遗漏了什么或者根本不可能

如果我创建了另一个名为
MyUserDetailsService.java
的类,那么编译工作和正确的类将在相应的端点中被访问。我只是不明白为什么
MyUserDetailsService
必须存在,而且我不能将
Test1
Test2
用作用户类

编辑:

Test1.java

@Service
@Component("user1")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("user2")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    @Qualifier(value = "user1")
    private Test1 test1;

    @Autowired
    @Qualifier(value = "user2")
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
@Service
@Component("myUserDetailsService")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("myUserDetailsService")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier(value = "myUserDetailsService")
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private Test1 test1;

    @Autowired
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
JwtRequestFilter.java

@Service
@Component("user1")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("user2")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    @Qualifier(value = "user1")
    private Test1 test1;

    @Autowired
    @Qualifier(value = "user2")
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
@Service
@Component("myUserDetailsService")
public class Test1 implements UserDetailsService {

    @Value("${test1.username}")
    private String test1Username;

    @Value("${test1.password}")
    private String test1Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test1Username)) {
            return new User(username, test1Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@Service
@Component("myUserDetailsService")
public class Test2 implements UserDetailsService {

    @Value("${test2.username}")
    private String test2Username;

    @Value("${test2.password}")
    private String test2Password;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        if (username != null && username.equals(test2Username)) {
            return new User(username, test2Password, new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Username not found: " + username);
        }
    }

}
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier(value = "myUserDetailsService")
    private UserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

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

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
            .authorizeRequests().antMatchers("/**/access-token").permitAll().
            anyRequest().authenticated().and().
            exceptionHandling().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

}
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private Test1 test1;

    @Autowired
    private Test2 test2;

    @Override
    protected void doFilterInternal() throws ServletException, IOException {
        // SOME CODE
    }
这给了我以下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.api.SpringMainApplication];

nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException:

Annotation-specified bean name 'myUserDetailsService' for bean class [com.api.jwt.users.Test2DetailsService] conflicts with existing, non-compatible bean definition of same name and class [com.api.jwt.users.Test1DetailsService]

这些声明不需要限定符。Spring可以按类型注入这些bean,因为每个类型(Test1和Test2)都有一个匹配的bean

但是,您确实需要为该声明提供一个限定符,因为您有两个
UserDetailsService
的实现,spring不知道要注入哪一个,从而导致错误

@Autowired
private UserDetailsService myUserDetailsService;
编辑

在更新的示例中,您定义了两个具有相同bean id的bean

@Component("myUserDetailsService")
public class Test1 implements UserDetailsService {

@Component("myUserDetailsService")
public class Test2 implements UserDetailsService {
这将导致您看到的新错误(可能有助于查看):

注释为bean类指定了bean名称“myUserDetailsService” [com.api.jwt.users.Test2DetailsService]与现有, 相同名称和类的不兼容bean定义 [com.api.jwt.users.Test1DetailsService]


在您的示例中,有两个
UserDetailsService
实现是没有意义的。您可以通过将它们合并到一个类中进行重构。

我编辑了我的问题。你介意再看一眼吗?我想我遇到的问题是我不能同时加载user1和user2。它是一个或另一个,但我需要加载它们,因为它们有自己特定的令牌机密和端点。基本上,我的问题是是否有一种方法可以使用
Test1
Test2
,而不必使用
MyUserDetailsService
类。现在我有所有3个类,它们都可以工作,但是如果我可以删除
MyUserDetailsService
就很理想了,这样我就不会有双重代码了。