Как я могу использовать хэш-пароли и солить их с помощью Spring Security 3?
Хеширование и соление паролей с помощью Spring Безопасность 3
Ответ 1
Программно-ориентированный, вы сделали бы это следующим образом:
В вашем файле application-context.xml(определенном в файле web.xml под contextConfigLocation
) укажите bean (в этом примере используется md5
).
<bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder" />
Затем Autowire encoder пароля:
@Autowired
PasswordEncoder passwordEncoder;
В вашем методе или где хотите хеш и соль.
passwordEncoder.encodePassword("MyPasswordAsString", "mySaltAsStringOrObject");
Вышеупомянутый вызов должен вернуть соленый хеш (как String
).
Это должно сделать это. Я предполагаю, что вы можете найти банку, в которой вы будете нуждаться.
UPDATE
Разумеется, использование MD5 - не лучшая идея. В идеале вы должны использовать SHA-256 по крайней мере. Это можно сделать с помощью ShaPasswordEncoder
.
Замените конфигурацию MD5 bean выше:
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<constructor-arg value="256"/>
</bean>
Ответ 2
Проще всего выглядит Spring Security 3.1, не требуя ограничений на способ хэширования:
<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder ref="encoder"/>
<security:jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select u.username, ur.authority from users u, user_roles ur where u.username = ur.username and u.username =?"/>
</security:authentication-provider>
</security:authentication-manager>
@Controller
@Stateless
public class UsersEJB {
@PersistenceContext(unitName = "somePU")
private EntityManager em;
@Transactional
public void create(Users users) {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(users.getPassword());
users.setPassword(hashedPassword);
em.persist(users);
}
}
Ответ 3
самый простой способ, поскольку документально:
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="userDetailsService" >
<password-encoder hash="sha">
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
НТН