Java Spring Boot OAuth 2 - Сервер авторизации не возвращает токен, нет 40-кратных ошибок состояния при неправильных учетных данных, отлично работает с правильными кредитами - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над созданием OAuth-сервера при Spring Boot с Postgres db, содержащей данные о пользователях.

Запрос аутентификации работает нормально, когда я предоставляю правильное имя пользователя и пароль [200 OK], я получаю аутентификациютокен на предъявителя, как и ожидалось, но в случае неправильных учетных данных, код идет в непрерывном цикле без возврата какого-либо ответа.Он продолжает бесконечно вызывать метод loadUserByUsername службы UserDetails и не прерывается даже при выдаче ошибки.

Ниже приведен фрагмент кода различных задействованных компонентов.Если кто-то может поделиться своими знаниями, где я делаю неправильно, увидев приведенный ниже код, это было бы очень полезно.

Конфигурация сервера авторизации

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

  @Autowired
  private AuthenticationManager authenticationManager;

  @Override
  public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    security.tokenKeyAccess("permitAll()")
      .checkTokenAccess("isAuthenticated()");
  }

  @Override
  public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
      .withClient("my-trusted-client")
      .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
      .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
      .scopes("read", "write", "trust")
      .resourceIds("myResource")
      .secret("{noop}secret")
      .accessTokenValiditySeconds(120).//Access token is only valid for 2 minutes.
      refreshTokenValiditySeconds(600);//Refresh token is only valid for 10 minutes.
}

  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
  endpoints.authenticationManager(authenticationManager);
  }
}

Конфигурация сервера ресурсов

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {


  @Autowired
  private PasswordEncoder userPasswordEncoder; 

  @Override
  @Bean
  public AuthenticationManager authenticationManagerBean() throws Exception {
      return super.authenticationManagerBean();
  }

  @Autowired
  private CustomUserDetailsService customUserDetailsService;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.requestMatchers()
        .antMatchers("/login", "/oauth/authorize")
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
    .formLogin()
    .permitAll();
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.parentAuthenticationManager(authenticationManagerBean())
        .userDetailsService(customUserDetailsService)
        .passwordEncoder(userPasswordEncoder);
  }
}

Ролевая сущность

@Entity
@Table(name="roles")
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="role_id")
    private int roleId;

    @Column(name="role")
    private String role;

    public Role() {}

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }


}

Пользовательская сущность

@Entity
@Table(name="users")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="user_id")
    private int id;

    @Column
    private String email;

    @Column
    private String name;

    @Column
    private String password;

    @Column
    private String lastName;

    @Column
    private String active;

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
//  @JoinTable(name="user_role",
//      joinColumns = @JoinColumn(name="user_id"),
//      inverseJoinColumns= @JoinColumn(name="role_id")
//      
//  )
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    public User() { }

    public User(User users) {
        this.active = users.active;
        this.email = users.email;
        this.id = users.id;
        this.lastName = users.lastName;
        this.name = users.name;
        this.password = users.password;
        this.roles = users.roles;
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getEmail() {
        return email;
    }


    public void setEmail(String email) {
        this.email = email;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getPassword() {
        return password;
    }


    public void setPassword(String password) {
        this.password = password;
    }


    public String getLastName() {
        return lastName;
    }


    public void setLastName(String lastName) {
        this.lastName = lastName;
    }


    public String getActive() {
        return active;
    }


    public void setActive(String active) {
        this.active = active;
    }


    public Set<Role> getRoles() {
        return roles;
    }


    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }



}

Пользовательская информация о пользователе Entity

public class CustomUserDetails implements UserDetails {

  private String username;
  private String password;
  private Collection authorities;

  public CustomUserDetails(User user) {
    this.username = user.getName();
    this.password = user.getPassword();
    this.authorities = user.getRoles().stream()
        .map(role -> new SimpleGrantedAuthority("ROLE_"+role.getRole()))
        .collect(Collectors.toList());
  }

  @Override
  public Collection getAuthorities() {
    return authorities;
  }

  @Override
  public String getPassword() {
    return password;
  }

  @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;
  }
}

Репозиторий пользователя

public interface UserRepository extends JpaRepository<User, Integer>{

    public Optional<User> findByName(String username);
}

Пользовательская информация о сервисе Impl

@Service
public class CustomUserDetailsService implements UserDetailsService {

  @Autowired
  private UserRepository userRepository;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    System.out.println(username); ***// this keeps printing endless times in case of bad credentials***
      Optional<User> user = userRepository.findByName(username);

    return new CustomUserDetails(
                user.orElseThrow(
                        () -> new UsernameNotFoundException("User not found")
                    )
            );
  }
}

Запросите, если кто-нибудь может вмешаться, и дайте мне знать, где я иду не так.Я думаю, что это также может быть очень маленькой / глупой ошибкой.Ищу вашу помощь.Заранее спасибо.

PS: Вот ссылка на учебник, за которым я следовал -> https://thecuriousdev.org/spring-security-oauth2

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