Аутентифицировать пользователя при весенней загрузке с помощью формы входа в систему - PullRequest
0 голосов
/ 31 марта 2020

Я добавил Spring Security в свой проект и пытаюсь выполнить аутентификацию пользователя. Я использую CrudRepository для поиска пользователя и проверки правильности данных. Я смог заставить его работать, используя пружины со страницы входа в систему. Моя проблема в том, что я хочу аутентифицировать пользователя через мою страницу входа в систему. Приложение загрузки Spring находится на 8080, а приложение реакции - 3000. Я видел настраиваемые страницы входа в систему, но страница входа находилась в том же месте, что и приложение загрузки весны. Мой вопрос: возможно ли, чтобы страница входа в систему находилась где-то еще, есть ли знак в конечной точке, на которую я могу отправить свой запрос для аутентификации пользователя? Или есть какой-то конфиг, который я могу добавить, чтобы сказать Spring, чтобы использовать пользовательские данные, поступающие из внешнего интерфейса, для аутентификации пользователя.

На стороне, которую я не понимаю, NoOpPasswordEncoder не следует использовать, это всего лишь PO C, и он не будет запущен в производство. Спасибо

Мой файл конфигурации безопасности выглядит следующим образом:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
}

@Override
protected void configure(HttpSecurity http) throws Exception {
             http
            .authorizeRequests()
            .antMatchers("/**").hasRole("ADMIN")
            .and()
            .formLogin();
}

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

UserDetailsServiceImpl:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private UserRepository userRepository;

public UserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}


@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    Optional< UserEntity > user= userRepository.findByEmail(email);
    user.orElseThrow(()-> new UsernameNotFoundException("Not found: " + email));
    return user.map(UserInfo::new).get();
}

}

UserDetailsImpl

public class UserInfo implements UserDetails {
private String userName;
public UserInfo(UserEntity userEntity){
this.userName=userEntity.getEmail();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return Arrays.asList(new SimpleGrantedAuthority("ADMIN"));
}

@Override
public String getPassword() {
    return "TestPassword";
}

@Override
public String getUsername() {
    return userName;
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}

}

Журнал безопасности Spring:

Создание цепочки фильтров: любой запрос, [org.springframework.security.web.context.request.asyn c. WebAsyncManagerIntegrationFilter@4529048e , org.springframework.security.web.context. SecurityContextPersistenceFilter@c247b02, org.springframework.security.web.header. HeaderWriterFilter@ecfff32, org.springframework.web.filter. CorsFilter@6addfa22, org.springframework.security.web.csrf . CsrfFilter@629cf53c, org.springframework.security.web.authentication.logout. LogoutFilter@7b38db21, org.springframework.security.web.authentication. UsernamePasswordAuthenticationFilter@3b18009f, org.springframework.security.web.savedrequest. RequestCacheAwareFilter@78f1d29, org .springframework.security.web.servletapi. SecurityContextHolderAwareRequestFilter@15405ba1, org.springframework.security.web.authentication. AnonymousAuthenticationFilter@74b521c, org.springframework.security.web.session. SessionManagementFilter@3c65f2e1, org.springframework.security.web.access . ExceptionTranslationFilter@531b1778, org.springframework.security.web.access.intercept. FilterSecurityInterceptor@458704ee]

1 Ответ

0 голосов
/ 01 апреля 2020

Во время разработки вы можете сделать запись в пакете. json файл в виде

"proxy": "http://localhost:8080/"

Как и в веб-приложении java, вы можете предоставить настраиваемое сопоставление запроса аутентификации и точку входа аутентификации:

@Autowired
RestAuthEntryPoint restAuthEntryPoint;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/**").hasRole("ADMIN")
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(restAuthEntryPoint) <- to support REST
        .and()
        .formLogin().loginProcessingUrl("/fooLogin"); <- credentials checked here
}

Для поддержки REST и обработки несанкционированного доступа к:

@Component
public class RestAuthEntryPoint implements AuthenticationEntryPoint{


@Override
public void commence(
        HttpServletRequest request,
        HttpServletResponse response,
        AuthenticationException authException) throws IOException {

    // send error response to the client (401 unauthorized)
    response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}

}

Отправка формы входа (основа c) в реакции:

 axios({
         method:'post',
         url:'//fooLogin',
         params:{
                username: this.state.email,
                password: this.state.password
            },
         config: { headers: {'Content-Type': 'application/x-www-form-urlencoded'}}
        })
        .then(
            //authentication success...
        })
        .catch(error=>{
            var errResp = error.response;
            if(errResp.status === 401){
               //Ex: show login page again...
            }

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