Невозможно выполнить аутентификацию, используя после реализации Bcrypt PasswordEncoder - PullRequest
0 голосов
/ 21 ноября 2018

после реализации Bcrypt Password Encoder я не могу пройти аутентификацию (неверные учетные данные).Вот пользователь, которого я добавляю:

userRepository.save(new User("First", "Last", "user", "user" , "email@email.com", "12345", superRoles));

Когда я просматриваю JSON для страницы, я вижу, что пароль хешируется.Однако, когда я пытаюсь ввести пароль «пользователь», я не могу аутентифицироваться:

..."password": "$2a$10$ZwUxEGVDAgI4qgkas0bEO.BmU1WrMXk1zQA5Jc70m.e6reiL3M7BG"...

Может кто-нибудь определить, если я делаю что-то не так?Код размещен ниже.Заранее спасибо!

Класс пользователя:

@Entity
public class User {
    public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();
    private long userId;
    private String userFirstName;
    private String userLastName;
    private String username;
    private String password;
    private String userPhone;
    private String userEmail;
    //others, such as List for roles, etc.

    public User() { }

    public User(String userFirstName, String userLastName, String username, String password, String userPhone, String userEmail, Map<String, Boolean> userRoles) {
        this.userFirstName = userFirstName;
        this.userLastName = userLastName;
        this.username = username;
        setPassword(password);
        this.userPhone = userPhone;
        this.userEmail = userEmail;
        this.userRoles = userRoles;
    }
    public void setPassword(String password) {
        this.password = PASSWORD_ENCODER.encode(password);
    }
        // other getters and setters
}

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

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    DetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
                .passwordEncoder(User.PASSWORD_ENCODER);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers(
                            "/login"
                    ).permitAll()
...
// taken out for brevity
    }
}

ПодробностиСервис:

@Component
public class DetailsService implements UserDetailsService {
    @Autowired
    UserRepository users;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = users.findByUsername(username);
        // Roles are implemented in the entity in a Map<String, Boolean>, e.g. "ROLE_ADMIN" : true, to help with easily setting new permissions on the front end
        List<String> roles = new ArrayList<>();

        for (Map.Entry<String, Boolean> entry : user.getUserRoles().entrySet()) {
            if (entry.getValue().equals(true)) {
                roles.add(entry.getKey());
            }
        }

        String[] permissions = roles.toArray(new String[roles.size()]);

        if (user == null) {
            throw new UsernameNotFoundException(username + " was not found");
        }
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(),
                user.getPassword(),
                AuthorityUtils.createAuthorityList(permissions)
        );
    }
}

Редактировать 2:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers(
                        "/login",
                        "/home",
                        "/visitor-area",
                        "/site.css",
                        "/app.js",
                        "/create-account",
                        "/css/*",
                        "/saveUser",
                        "/users"
                ).permitAll()
            .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/user-dashboard")
            .and()
            .logout()
                .permitAll()
                .logoutSuccessUrl("/home")
            .and()
            .csrf().disable();
    }

1 Ответ

0 голосов
/ 21 ноября 2018

Решено:

Когда я зашифровал пароль для объекта User, он не прошел бы аутентификацию.Чтобы исправить это, я вернулся к обычному String password, getter / setter и setPassword(password) в конструкторе.Затем в классе, который реализует ApplicationRunner, я там зашифровал пароль:

    String password = "user";
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String hashedPassword = passwordEncoder.encode(password);

    userRepository.save(new User("First", "Last", "user", hashedPassword , "email@email.com", "12345", superRoles));
...