Recipe Name:
Spring Security recommends DelegatingPasswordEncoder for best practices (BCrypt)
Description:
DelegatingPasswordEncoder allows more flexibility when using several encoders, for code changes, and for migrating
Level:
info
Language:
- java
Tags:
- Spring
- security
- framework specific
- Spring Security
Documentation
Best practices for password encoding are bound to change. Spring Security provides
DelegatingPasswordEncoder
to facilitate implementing the recommended password storage practices. It allows easy upgrading to a newer encoding, and at the same time permit legacy encoding that cannot be migrated, to remain in the code base.
PasswordEncoderFactories.createDelegatingPasswordEncoder()
will create an instance of DelegatingPasswordEncoder
that will default to the use of BCrypt.
Before: | BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); |
After: | PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); |
Resources
Recipe
id: scw:spring:security:DelegatingPasswordEncoder-bean-assignment version: 10 metadata: name: Spring Security recommends DelegatingPasswordEncoder for best practices (BCrypt) shortDescription: DelegatingPasswordEncoder allows more flexibility when using several encoders, for code changes, and for migrating level: info language: java enabled: true descriptionFile: descriptions/SpringSecurityrecommendsDelegatePasswordEncoderforbestpracticesBCrypt.html tags: Spring;security;framework specific;Spring Security search: assignment: not: in: method: annotation: type: Bean returnType: '{{{ type }}}' expressionType: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder availableFixes: - name: Use a customizable instance of DelegatingPasswordEncoder actions: - rewrite: to: |- java.util.Map<String, org.springframework.security.crypto.password.PasswordEncoder> encoders = new java.util.HashMap<>(); encoders.put("{{#sed}}s/passwordencoder//g,{{#lowerCase}}{{{ typeElement }}}{{/lowerCase}}{{/sed}}", {{{ assignedExpression }}}); org.springframework.security.crypto.password.PasswordEncoder {{{ qualifier }}} = new org.springframework.security.crypto.password.DelegatingPasswordEncoder("{{#sed}}s/passwordencoder//g,{{#lowerCase}}{{{ typeElement }}}{{/lowerCase}}{{/sed}}", encoders); target: self - name: 'Create an instance of DelegatingPasswordEncoder using PasswordEncoderFactories (default: bcrypt)' actions: - rewrite: to: org.springframework.security.crypto.password.PasswordEncoder {{{ qualifier }}} = org.springframework.security.crypto.factory.PasswordEncoderFactories.createDelegatingPasswordEncoder();