I'm trying to learn Spring security currently. I used BCryptPasswordEncoder
to encode user password before persisting into a database
Code:
@Override
public void saveUser(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
user.setActive(1);
Role userRole = roleRepository.findByRole("ADMIN");
user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
userRepository.save(user);
}
Then used it during authentication as well and User was getting authenticated as expected.
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.
jdbcAuthentication()
.usersByUsernameQuery(usersQuery)
.authoritiesByUsernameQuery(rolesQuery)
.dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
}
Then I removed .passwordEncoder(bCryptPasswordEncoder);
from configure()
method, still users with encoded password is getting authenticated successfully.
Then I removed password encoder from both the saveUser()
and the configure()
method, and persisted a User
into the database(i.e without password encoding) and tried to access an authenticated page but I got AccessedDeniedException
,
But users with encoded password still gets authenticated even though i removed passwordEncoder()
from configure()
method. Why is this happening?
Does spring security by default use password encoder during authentication?
If so how to use spring security without password encoding?
With Spring Security 5 encryption on passwords is always enabled. The encryption used by default is bcrypt
. What is neat about Spring Security 5 is that it actually allows you to specify, in your password, which encryption was used to create the has.
For this see the Password Storage Format in the Spring Security Reference Guide. In short it allows you to prefix your password for a well known key to an algorithm. The storage format is {<encryption>}<your-password-hash>
.
When using nothing it would become {noop}your-password
(which would use the NoOpPasswordEncoder
and {bcrypt}$a2......
would use the BcryptPasswordEncoder
. There are several algorithms supported out-of-the-box, but you can also define your own.
To define your own create your own PasswordEncoder
and register it under a key with the DelegatingPasswordEncoder
.