Я делаю свой проект B.Tech, и все шло хорошо, но теперь я застрял в настройке аутентификации для двух разных типов пользователей, т.е. клиентов и поставщиков услуг. Я использую MongoDB.
У меня есть две разные базы данных для каждого пользователя. Я пытаюсь создать несколько страниц входа в систему, которые будут аутентифицировать пользователя из соответствующих баз данных. Я использую order (1) и order (2) для конфигурации, но работает только order (1).
Это мой код конфигурации.
@Configuration
@EnableWebSecurity
public class MultiLoginConfig {
@Configuration
@Order(1)
public static class DearHelpUserSecConfig extends WebSecurityConfigurerAdapter{
@Override
@Bean
protected UserDetailsService userDetailsService() {
return new CustomUserDetailsService();
}
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers( "/home").permitAll()
.antMatchers("/hellouser").access("hasRole('USER')")
.and()
.formLogin()
.loginPage("/login1")
.permitAll()
.and()
.logout()
.permitAll()
.logoutUrl("/logout").
logoutSuccessUrl("/home")
.and()
.userDetailsService(userDetailsService());
}
}
@Configuration
@Order(2)
public static class DearHelpSPSecConfig extends WebSecurityConfigurerAdapter{
@Override
@Bean
protected UserDetailsService userDetailsService() {
return new SPUserDetailsService();
}
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers( "/home").permitAll()
.antMatchers("/hellosp").access("hasRole('SP')")
.and()
.formLogin()
.loginPage("/login2")
.permitAll()
.and()
.logout()
.permitAll()
.logoutUrl("/logout").
logoutSuccessUrl("/home")
.and()
.userDetailsService(userDetailsService());
}
}
}
Я внедряю Custom UserDetailsService для каждого пользователя.
Пользовательская реализация для клиентов UserDetailsServices - это ..
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Query query = new Query();
query.addCriteria(Criteria.where("email").is(email));
DearHelpUsers user =
mongoTemplate.findOne(query, DearHelpUsers.class);
if (user == null) {
throw new UsernameNotFoundException(String.format("email %s not found", email));
}
return new User(user.getEmail(), user.getPassword(),
AuthorityUtils.createAuthorityList(user.getRole()));
}
}
Пользовательская реализация для провайдеров услуг UserDetailsServices: ..
public class SPUserDetailsService implements UserDetailsService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Query query = new Query();
query.addCriteria(Criteria.where("email").is(email));
ServiceProviders user =
mongoTemplate.findOne(query, ServiceProviders.class);
System.out.println(user);
if (user == null) {
throw new UsernameNotFoundException(String.format("email %s not found", email));
}
return new User(user.getEmail(), user.getPassword(),
AuthorityUtils.createAuthorityList(user.getRole()));
}
}
Когда я пытаюсь получить доступ к странице «Клиенты», т. Е. «/ Hellouser», появляется страница входа в систему, и аутентификация работает нормально.
Но когда я пытаюсь получить доступ к странице поставщика услуг, т.е. "/ hellosp", она доступна без входа в систему пользователя. Авторизация для поставщиков услуг не работает.
Я попытался изменить порядок и заметил, что авторизация только для кода order (1) работает, но order (2) не работает.
Где я делаю не так?
Любая помощь будет высоко оценен.
Спасибо