Improve commandline help for encodepassword command in the CLI

Closes gh-38203
This commit is contained in:
Moritz Halbritter 2023-11-07 11:22:22 +01:00
parent 717d7a4850
commit fc6d4ef2c0
2 changed files with 21 additions and 4 deletions

View File

@ -44,6 +44,7 @@ import org.springframework.util.StringUtils;
* {@link Command} to encode passwords for use with Spring Security. * {@link Command} to encode passwords for use with Spring Security.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Moritz Halbritter
* @since 2.0.0 * @since 2.0.0
*/ */
public class EncodePasswordCommand extends OptionParsingCommand { public class EncodePasswordCommand extends OptionParsingCommand {
@ -70,8 +71,8 @@ public class EncodePasswordCommand extends OptionParsingCommand {
@Override @Override
public Collection<HelpExample> getExamples() { public Collection<HelpExample> getExamples() {
List<HelpExample> examples = new ArrayList<>(); List<HelpExample> examples = new ArrayList<>();
examples examples.add(new HelpExample("To encode a password with the default (bcrypt) encoder",
.add(new HelpExample("To encode a password with the default encoder", "spring encodepassword mypassword")); "spring encodepassword mypassword"));
examples.add(new HelpExample("To encode a password with pbkdf2", "spring encodepassword -a pbkdf2 mypassword")); examples.add(new HelpExample("To encode a password with pbkdf2", "spring encodepassword -a pbkdf2 mypassword"));
return examples; return examples;
} }
@ -82,12 +83,16 @@ public class EncodePasswordCommand extends OptionParsingCommand {
@Override @Override
protected void options() { protected void options() {
this.algorithm = option(Arrays.asList("algorithm", "a"), "The algorithm to use").withRequiredArg() this.algorithm = option(Arrays.asList("algorithm", "a"),
"The algorithm to use. Supported algorithms: "
+ StringUtils.collectionToDelimitedString(ENCODERS.keySet(), ", ")
+ ". The default algorithm uses bcrypt")
.withRequiredArg()
.defaultsTo("default"); .defaultsTo("default");
} }
@Override @Override
protected ExitStatus run(OptionSet options) throws Exception { protected ExitStatus run(OptionSet options) {
if (options.nonOptionArguments().size() != 1) { if (options.nonOptionArguments().size() != 1) {
Log.error("A single password option must be provided"); Log.error("A single password option must be provided");
return ExitStatus.ERROR; return ExitStatus.ERROR;

View File

@ -37,6 +37,7 @@ import static org.mockito.BDDMockito.then;
* Tests for {@link EncodePasswordCommand}. * Tests for {@link EncodePasswordCommand}.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Moritz Halbritter
*/ */
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
class EncodePasswordCommandTests { class EncodePasswordCommandTests {
@ -67,6 +68,17 @@ class EncodePasswordCommandTests {
assertThat(status).isEqualTo(ExitStatus.OK); assertThat(status).isEqualTo(ExitStatus.OK);
} }
@Test
void encodeWithDefaultShouldUseBcrypt() throws Exception {
EncodePasswordCommand command = new EncodePasswordCommand();
ExitStatus status = command.run("-a", "default", "boot");
then(this.log).should().info(this.message.capture());
assertThat(this.message.getValue()).startsWith("{bcrypt}");
assertThat(PasswordEncoderFactories.createDelegatingPasswordEncoder().matches("boot", this.message.getValue()))
.isTrue();
assertThat(status).isEqualTo(ExitStatus.OK);
}
@Test @Test
void encodeWithBCryptShouldUseBCrypt() throws Exception { void encodeWithBCryptShouldUseBCrypt() throws Exception {
EncodePasswordCommand command = new EncodePasswordCommand(); EncodePasswordCommand command = new EncodePasswordCommand();