Spring Security — хеширование (bcrypt example)
Использование хешированных паролей в Spring Security 4.
Используемые технологии
- Spring 4.2.2.RELEASE
- Spring Security 4.0.2.RELEASE
- MySQL 5.6.25
- JSP 1.2.1
- IntelliJ IDEA 14
- Maven 3.2.5
1. Описание задачи
Хранение паролей в открытом виде плохая практика. Рассмотрим как сохранять пароли с использованием bcrypt — адаптивной криптографической хеш-функции. В Spring Security поддерживаются многие другие способы хеширования, а настройки перехода между разными вариантами осуществляется в паре строк.
2. Шифрование пароля
Для хеширования пароля воспользовался первой ссылкой google по запросу bcrypt online. Получим хеш функцию для пароля password:
password = $2a$12$x0gRqdkZvaxAz8q9ORB9SOCWbGoSoTufquPbKIWO0iy8VLfDH.gWK (bctypt 12)
Теперь вставим его в базу данных для нашего пользователя.
3. Настройка spring-security-config.xml
1 2 3 4 5 6 7 8 9 |
<authentication-manager> <authentication-provider user-service-ref="jdbcGroupsImpl"> <password-encoder ref="bcryptBean"/> </authentication-provider> </authentication-manager> <b:bean id="bcryptBean" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> <b:constructor-arg name="strength" value="12"/> </b:bean> |
Полный листинг:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<?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" 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 pattern="/favicon.ico" security="none" /> <http use-expressions="true"> <intercept-url pattern="/" access="isFullyAuthenticated() or isAnonymous()"/> <intercept-url pattern="/login.jsp*" access="isFullyAuthenticated() or isAnonymous()"/> <intercept-url pattern="/admin" access="hasRole('ADMIN')"/> <intercept-url pattern="/exitUser*" access="isFullyAuthenticated() or isAnonymous()"/> <intercept-url pattern="/**" access="hasRole('USER')"/> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" authentication-success-handler-ref="savedRequestAwareAuthenticationSuccessHandler"/> <access-denied-handler error-page="/accessDenied.jsp"/> <http-basic/> <logout logout-success-url="/exitUser.jsp"/> <remember-me key="myAppKey" user-service-ref="jdbcGroupsImpl" token-repository-ref="tokenRepository" remember-me-cookie="remember-me-cookieName" remember-me-parameter="remember-me-parameter" token-validity-seconds="1800"/> <headers/> <csrf/> </http> <authentication-manager> <authentication-provider user-service-ref="jdbcGroupsImpl"> <password-encoder ref="bcryptBean"/> </authentication-provider> </authentication-manager> <b:bean id="jdbcGroupsImpl" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <b:property name="enableGroups" value="true"/> <b:property name="enableAuthorities" value="false"/> <b:property name="dataSource" ref="dataSource"/> </b:bean> <b:bean id="tokenRepository" class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl"> <b:property name="dataSource" ref="dataSource"/> </b:bean> <b:bean id="bcryptBean" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> <b:constructor-arg name="strength" value="12"/> </b:bean> </b:beans> |
Для работы с паролями в хешированном виде необходимо добавить тег <password-encoder/> и соответствующий бин.
Больше никаких настроек не требуется. При входе в приложение после ввода admin\password всё отработает корректно. Если же ввести user\user, то доступ будет закрыт, т.к. введенный пароль user должен соответствовать записи в базе данных $2a$12$H1UMbYdG1hxdwIsOGEUgBOzLdm0KMvkVqdc5YjuJcaSCLfX95fsU6, а на скриншоте видно, что он остался прежним.
Исходные коды
Spring Security bcrypt Example
8