Spring BCryptPasswordEncoder некорректно работает

226
26 октября 2017, 07:12

Я использую BCryptPasswordEncoder для шифрования пароля при регистрации на сайте. Но есть проблема, при логине пароль пользователя не подтверждается. В классе BCryptPasswordEncoder есть метод, который сравнивает введенный пароль и зашифрованный из БД. Но в примерах это все работает на автомате на уровне Spring.

Security xml

 <?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:security="http://www.springframework.org/schema/security"
         xsi:schemaLocation="
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    <http realm="BookManager"  auto-config="true" use-expressions="true"  >
        <intercept-url pattern="/add" access="ROLE_ADMIN" />
        <intercept-url pattern="/remove" access="ROLE_ADMIN" />
        <intercept-url pattern="/edit" access="ROLE_ADMIN" />
        <intercept-url pattern="/books" access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/login.jsp*" access="permitAll"/>
        <form-login login-page= "/login"
                             username-parameter= "username"
                             password-parameter= "password"
                             login-processing-url= "/login"
                             authentication-failure-url= "/login.jsp?error=true" />
        <logout logout-url= "/j_spring_security_logout" logout-success-url= "/index"/>
        <!--<form-login login-page="/login.jsp" default-target-url="/index.jsp"
                       authentication-failure-url="/login.jsp?error=1" />
        <logout logout-url="/logout" logout-success-url="/index" />-->
        <anonymous username="guest" granted-authority="ROLE_ANONYMOUS" />
        <csrf disabled="true"/>

    <!--Save logged user in cookie with name key='name' -->
    <remember-me key= "myKey" token-validity-seconds= "300"/>
    </http>
    <!-- Declare an authentication-manager to use a custom userDetailsService -->
    <authentication-manager alias= "authenticationManager">
        <authentication-provider user-service-ref="customUserDetailsService">
            <password-encoder ref="encoder" />
        </authentication-provider>
    </authentication-manager>

    <!-- Use a SHA-1 encoder since the user's passwords are stored as SHA-1 in the database -->
    <b:bean id="encoder"
                class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
        <b:constructor-arg name="strength" value="11"/>
    </b:bean>
    <!-- A custom service where Spring will retrieve users and their corresponding access levels  -->
    <b:bean class="BookManager.Service.CustomUserDetailsService" id="customUserDetailsService">
        <b:property name="encoder" ref="encoder"/>
    </b:bean>
</b:beans>

Шифрование при добавлении пользователя

  public void addUser(User user)
      {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        userDao.addUser(user);
      }

Метод проверки пользователя

 public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException
      {
        UserDetails userDetails = null;
        User user = userService.searchUser(s);   
        userDetails = new org.springframework.security.core.userdetails.User(
                        user.getUsername(),
                        user.getPassword().toLowerCase(),
                        true,
                        true,
                        true,
                        true,
                        getAuthorities(user.getAccess()));
        return userDetails;
      }

UPD В моем понимании все должно работать так: при вводе логина и пароля Spring вызывает метод loadUserByUsername, где по логину юзер достается из БД,Spring автоматически сравнивает введенный пароль с паролем из БД. Это работает. При подключении BCryptPasswordEncoder для сравнения паролей Spring должен вызывать метод аналогичен методу matches (или его же) автоматически. Но может я не правильно понимаю)) Делал по аналогии статьи Важно еще то, что когда подключен бин encoder то не логинится даже с не шифрованными паролями в бд, если отключаешь то все в порядке, кроме конечно шифрованных паролей.

READ ALSO
Отловить первый запуск приложения

Отловить первый запуск приложения

Объясните пожалуйста в теории, как отловить первый запуск приложения? Читал тут, не то, все слишком громоздко

234
Считывание текста из файла в нужной кодировке

Считывание текста из файла в нужной кодировке

Необходимо считать строки из файла и записать их в массив, а потом отобразить на лейблеНо почему-то русскую кодировку не распознает

308