Java com.api.WebSecurityConfig中的字段myUserDetailsService需要一个bean,但找到了2个
完全错误: 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
- 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]中定义
@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
就很理想了,这样我就不会有双重代码了。