Spring Security Authentication - PullRequest
       5

Spring Security Authentication

0 голосов
/ 29 августа 2018

Я не могу выполнить аутентификацию весной, используя Spring Security с использованием MongoDB.

Сущность:

@Document(collection = "users")
public class Users {

    @Id
    private String id;
    private String username;
    private String email;
    private String password;
    private List<Notification> preferences;


    public Users(String username, String email, String password, List<Notification> preferences) {
        this.username = username;
        this.email = email;
        this.password = password;
        this.preferences = preferences;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPassword() {
        return password;
    }

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

    public List<Notification> getPreferences() {
        return preferences;
    }

    public void setPreferences(List<Notification> preferences) {
        this.preferences = preferences;
    }
}

Сервис:

@Component
public class MongoUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository repository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Users user = repository.findByUsername(username);

        if(user == null) {
            throw new UsernameNotFoundException("User not found");
        }

        List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority("user"));

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

Репозиторий:

import com.example.Start.entities.Users;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<Users, String> {
    Users findByUsername(String username);
}

Конфигурация:

    @Configuration
    @EnableConfigurationProperties
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Autowired
        MongoUserDetailsService userDetailsService;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .csrf().disable()
                    .authorizeRequests().anyRequest().authenticated()
                    .and().httpBasic()
                    .and().sessionManagement().disable();
        }

        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }

        @Override
        public void configure(AuthenticationManagerBuilder builder) throws Exception {
            builder.userDetailsService(userDetailsService);
        }
    }

Когда я пытаюсь аутентифицироваться, это дает мне следующее: введите описание изображения здесь

В моей базе данных есть пользователь:

{
    "_id" : ObjectId("5b855813d03cce0264de3ab6"),
    "username" : "username",
    "email" : "test@test.com",
    "password" : "123"
}

Есть идеи, что это вызывает?

1 Ответ

0 голосов
/ 29 августа 2018

Проблема в том, что вы зарегистрировали BCryptPasswordEncoder в качестве компонента passwordEncoder, но вы сохранили пароль в виде открытого текста в базе данных. Теперь, когда происходит аутентификация, она кодирует входящий пароль из HTTP-запроса с помощью алгоритма BCrypt и сравнивает его с открытым текстом, который, очевидно, не удастся. Вот почему вы получаете «Кодированный пароль не похож на BCrypt», потому что это не так.

Краткое исправление будет состоять в том, чтобы отредактировать вашу пользовательскую запись mongodb, чтобы она имела следующее значение для поля пароля пользователя с именем пользователя "username", например:

{
    "_id" : ObjectId("5b855813d03cce0264de3ab6"),
    "username" : "username",
    "email" : "test@test.com",
    "password" : "$2a$10$pIUUIHClmGYBnsJzlOHQkeecSwRGAgYlxzRfBFjEqhk6rkQdilTYC"
}

Когда вы кодируете строку «123» с помощью алгоритма BCrypt, вы получите «$ 2a $ 10 $ pIUUIHClmGYBnsJzlOHQkeecSwRGAgYlxzRfBFjEqhk6rkQdilTYC".

но правильным исправлением будет добавление кода для кодирования ваших паролей перед сохранением в базе данных Mongo в приложении, как показано ниже:

@Autowired
private PasswordEncoder passwordEncoder;

public void saveUser(Users user) {
    user.setPassword(passwordEncoder.encoder(user.getPassword()));
    // Save in mongodb
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...