Как настроить несколько страниц входа в систему с использованием нескольких баз данных для аутентификации в Springboot с использованием mongodb - PullRequest
0 голосов
/ 27 марта 2019

Я делаю свой проект 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) не работает. Где я делаю не так? Любая помощь будет высоко оценен. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...