Я использую 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 то не логинится даже с не шифрованными паролями в бд, если отключаешь то все в порядке, кроме конечно шифрованных паролей.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Объясните пожалуйста в теории, как отловить первый запуск приложения? Читал тут, не то, все слишком громоздко
Необходимо считать строки из файла и записать их в массив, а потом отобразить на лейблеНо почему-то русскую кодировку не распознает
Здравствуйте господа форумчане!