Skip to content

Commit 8c3598b

Browse files
the-java-guyKevinGilmore
authored andcommitted
BAEL - 2166 (eugenp#5379)
* Bean Object, server side and client side example for event streaming example * BAEL-1628 Access a File from the Classpath in a Spring Application * inputstream retrieval added * Removed files related to evaluation article * + Aligning code to the article. Removed Utility methods and classes * Precommit fix * PMD fixes * Code Review changes Refactored : whenResourceUtils_thenReadSuccessful * BAEL-1934 * +indentation correction in pom.xml * synced with master * Precommit : rebase * BAEL-1782 * BAEL - 2166 : Password Generation * Removed unnecessary javaDoc * Segregated utility method
1 parent 831cdf2 commit 8c3598b

3 files changed

Lines changed: 227 additions & 1 deletion

File tree

java-strings/pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,17 @@
6868
<artifactId>emoji-java</artifactId>
6969
<version>4.0.0</version>
7070
</dependency>
71-
71+
<!-- Added for password generation -->
72+
<dependency>
73+
<groupId>org.passay</groupId>
74+
<artifactId>passay</artifactId>
75+
<version>1.3.1</version>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.apache.commons</groupId>
79+
<artifactId>commons-text</artifactId>
80+
<version>1.4</version>
81+
</dependency>
7282
</dependencies>
7383

7484
<build>
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package com.baeldung.string.password;
2+
3+
import java.security.SecureRandom;
4+
import java.util.Collections;
5+
import java.util.List;
6+
import java.util.Random;
7+
import java.util.stream.Collectors;
8+
import java.util.stream.IntStream;
9+
import java.util.stream.Stream;
10+
11+
import org.apache.commons.lang3.RandomStringUtils;
12+
import org.apache.commons.text.RandomStringGenerator;
13+
import org.passay.CharacterData;
14+
import org.passay.CharacterRule;
15+
import org.passay.EnglishCharacterData;
16+
import org.passay.PasswordGenerator;
17+
18+
public class RandomPasswordGenerator {
19+
20+
/**
21+
* Special characters allowed in password.
22+
*/
23+
public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+";
24+
25+
public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS";
26+
27+
Random random = new SecureRandom();
28+
29+
public String generatePassayPassword() {
30+
PasswordGenerator gen = new PasswordGenerator();
31+
CharacterData lowerCaseChars = EnglishCharacterData.LowerCase;
32+
CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars);
33+
lowerCaseRule.setNumberOfCharacters(2);
34+
CharacterData upperCaseChars = EnglishCharacterData.UpperCase;
35+
CharacterRule upperCaseRule = new CharacterRule(upperCaseChars);
36+
upperCaseRule.setNumberOfCharacters(2);
37+
CharacterData digitChars = EnglishCharacterData.Digit;
38+
CharacterRule digitRule = new CharacterRule(digitChars);
39+
digitRule.setNumberOfCharacters(2);
40+
CharacterData specialChars = new CharacterData() {
41+
public String getErrorCode() {
42+
return ERROR_CODE;
43+
}
44+
45+
public String getCharacters() {
46+
return ALLOWED_SPL_CHARACTERS;
47+
}
48+
};
49+
CharacterRule splCharRule = new CharacterRule(specialChars);
50+
splCharRule.setNumberOfCharacters(2);
51+
String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule);
52+
return password;
53+
}
54+
55+
public String generateCommonTextPassword() {
56+
String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2))
57+
.concat(generateRandomAlphabet(2, true))
58+
.concat(generateRandomAlphabet(2, false))
59+
.concat(generateRandomCharacters(2));
60+
List<Character> pwChars = pwString.chars()
61+
.mapToObj(data -> (char) data)
62+
.collect(Collectors.toList());
63+
Collections.shuffle(pwChars);
64+
String password = pwChars.stream()
65+
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
66+
.toString();
67+
return password;
68+
}
69+
70+
public String generateCommonsLang3Password() {
71+
String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true);
72+
String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true);
73+
String numbers = RandomStringUtils.randomNumeric(2);
74+
String specialChar = RandomStringUtils.random(2, 33, 47, false, false);
75+
String totalChars = RandomStringUtils.randomAlphanumeric(2);
76+
String combinedChars = upperCaseLetters.concat(lowerCaseLetters)
77+
.concat(numbers)
78+
.concat(specialChar)
79+
.concat(totalChars);
80+
List<Character> pwdChars = combinedChars.chars()
81+
.mapToObj(c -> (char) c)
82+
.collect(Collectors.toList());
83+
Collections.shuffle(pwdChars);
84+
String password = pwdChars.stream()
85+
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
86+
.toString();
87+
return password;
88+
}
89+
90+
public String generateSecureRandomPassword() {
91+
Stream<Character> pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false))));
92+
List<Character> charList = pwdStream.collect(Collectors.toList());
93+
Collections.shuffle(charList);
94+
String password = charList.stream()
95+
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
96+
.toString();
97+
return password;
98+
}
99+
100+
public String generateRandomSpecialCharacters(int length) {
101+
RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45)
102+
.build();
103+
return pwdGenerator.generate(length);
104+
}
105+
106+
public String generateRandomNumbers(int length) {
107+
RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57)
108+
.build();
109+
return pwdGenerator.generate(length);
110+
}
111+
112+
public String generateRandomCharacters(int length) {
113+
RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57)
114+
.build();
115+
return pwdGenerator.generate(length);
116+
}
117+
118+
public String generateRandomAlphabet(int length, boolean lowerCase) {
119+
int low;
120+
int hi;
121+
if (lowerCase) {
122+
low = 97;
123+
hi = 122;
124+
} else {
125+
low = 65;
126+
hi = 90;
127+
}
128+
RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi)
129+
.build();
130+
return pwdGenerator.generate(length);
131+
}
132+
133+
public Stream<Character> getRandomAlphabets(int count, boolean upperCase) {
134+
IntStream characters = null;
135+
if (upperCase) {
136+
characters = random.ints(count, 65, 90);
137+
} else {
138+
characters = random.ints(count, 97, 122);
139+
}
140+
return characters.mapToObj(data -> (char) data);
141+
}
142+
143+
public Stream<Character> getRandomNumbers(int count) {
144+
IntStream numbers = random.ints(count, 48, 57);
145+
return numbers.mapToObj(data -> (char) data);
146+
}
147+
148+
public Stream<Character> getRandomSpecialChars(int count) {
149+
IntStream specialChars = random.ints(count, 33, 45);
150+
return specialChars.mapToObj(data -> (char) data);
151+
}
152+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.baeldung.string.password;
2+
3+
import static org.junit.Assert.assertTrue;
4+
5+
import org.junit.Test;
6+
7+
/**
8+
* Examples of passwords conforming to various specifications, using different libraries.
9+
*
10+
*/
11+
public class StringPasswordUnitTest {
12+
13+
RandomPasswordGenerator passGen = new RandomPasswordGenerator();
14+
15+
@Test
16+
public void whenPasswordGeneratedUsingPassay_thenSuccessful() {
17+
String password = passGen.generatePassayPassword();
18+
int specialCharCount = 0;
19+
for (char c : password.toCharArray()) {
20+
if (c >= 33 || c <= 47) {
21+
specialCharCount++;
22+
}
23+
}
24+
assertTrue("Password validation failed in Passay", specialCharCount >= 2);
25+
}
26+
27+
@Test
28+
public void whenPasswordGeneratedUsingCommonsText_thenSuccessful() {
29+
RandomPasswordGenerator passGen = new RandomPasswordGenerator();
30+
String password = passGen.generateCommonTextPassword();
31+
int lowerCaseCount = 0;
32+
for (char c : password.toCharArray()) {
33+
if (c >= 97 || c <= 122) {
34+
lowerCaseCount++;
35+
}
36+
}
37+
assertTrue("Password validation failed in commons-text ", lowerCaseCount >= 2);
38+
}
39+
40+
@Test
41+
public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful() {
42+
String password = passGen.generateCommonsLang3Password();
43+
int numCount = 0;
44+
for (char c : password.toCharArray()) {
45+
if (c >= 48 || c <= 57) {
46+
numCount++;
47+
}
48+
}
49+
assertTrue("Password validation failed in commons-lang3", numCount >= 2);
50+
}
51+
52+
@Test
53+
public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful() {
54+
String password = passGen.generateSecureRandomPassword();
55+
int specialCharCount = 0;
56+
for (char c : password.toCharArray()) {
57+
if (c >= 33 || c <= 47) {
58+
specialCharCount++;
59+
}
60+
}
61+
assertTrue("Password validation failed in Secure Random", specialCharCount >= 2);
62+
}
63+
64+
}

0 commit comments

Comments
 (0)