Настройте Spring для использования базы данных для аутентификации - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу настроить Spring Security на использование базы данных для запросов API ap. Я попробовал это:

    @Configuration
    @EnableWebSecurity
    @Import(value= {Application.class, ContextDatasource.class})
    @ComponentScan(basePackages= {"org.rest.api.server.*"})
    public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired 
        private RestAuthEntryPoint authenticationEntryPoint;

        @Autowired
        MyUserDetailsService myUserDetailsService;

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    //      auth
    //      .inMemoryAuthentication()
    //      .withUser("test")
    //      .password(passwordEncoder().encode("testpwd"))
    //      .authorities("ROLE_USER");
            auth.userDetailsService(myUserDetailsService);
            auth.authenticationProvider(authenticationProvider());
        }
        @Bean
        public DaoAuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(myUserDetailsService);
            authenticationProvider.setPasswordEncoder(passwordEncoder());
            return authenticationProvider;
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
            .authorizeRequests()
            .antMatchers("/securityNone")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .authenticationEntryPoint(authenticationEntryPoint);
        }
        @Bean
        public PasswordEncoder passwordEncoder() {
            return NoOpPasswordEncoder.getInstance();
        }
    }

Услуги:

    public interface MerchantsService {

        public Merchants getCredentials(String login, String pwd) throws Exception;
    }

Реализация сервиса

@Service
@Qualifier("merchantsService")
@Transactional
public class MerchantsServiceImpl implements MerchantsService {

    @Autowired
    private EntityManager entityManager;

    @Override
    public Merchants getCredentials(String login, String pwd) throws Exception {
        String hql = "select e from " + Merchants.class.getName() + " e where e.login = ? and e.pwd = ?";

        Query query = entityManager.createQuery(hql).setParameter(0, login).setParameter(1, pwd);
        Merchants merchants = (Merchants) query.getSingleResult();

        return merchants;
    }
}



    @Service
    public class MyUserDetailsService implements UserDetailsService {

        @Autowired
        private MerchantsService merchantsService;

        @Override
        public Merchants loadUserByUsername(String username) {
            Merchants user = merchantsService.getCredentials(username, pwd);
            if (user == null) {
                throw new UsernameNotFoundException(username);
            }
            return user;
        }
    }

У меня 2 вопроса:

  1. Как я могу использовать объект Merchant, но Spring принимает Object UserDetails. Как я могу реализовать эту функциональность?

  2. Как я могу аутентифицировать запросы с помощью имени пользователя и пароля. Я вижу, что public UserDetails loadUserByUsername(String username) может принимать только имя пользователя. Есть ли другой способ реализовать код?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Когда вы используете Spring Security, вы должны реализовать сервис, который реализует UserDetailsService и соответствующий ему метод loadUserByUsername, который возвращает UserDetails. Вот пример метода:

@Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = this.getUserByUsername(username); // getting the user from the database with our own method
    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
  }

Вам не нужно беспокоиться о проверке подлинности пароля, потому что весенняя безопасность возьмет его на себя.

0 голосов
/ 07 сентября 2018

Вы должны вернуть User объект класса, который сам является реализацией интерфейса UserDetails.Получив аутентификацию, вы получаете объект Merchants.Вы должны получить учетные данные пользователя, а также роль.Еще одно предложение: постарайтесь сохранить имя класса в единственном числе.

public UserDetails loadUserByUsername(String username) {
 Merchants user = merchantsService.getCredentials(username, pwd);

        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
        for (Role role : user.getRoles()){
            grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
        }

        return new User(user.getUsername(), user.getPassword(), grantedAuthorities);
}

Вам не нужно вводить пароль в соответствии с вашим собственным, это делает Spring Security самостоятельно, используя PasswordEncoder.

Для получения более подробной информации перейдите по ссылке ниже.https://hellokoding.com/registration-and-login-example-with-spring-security-spring-boot-spring-data-jpa-hsql-jsp/

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