Skip to content

Commit f690a7f

Browse files
committed
Encapsulate extractPrincipalNameFromEmail property
This simplifies the logic when extracting the principal and allows more flexibility in the future by allowing the format and regex to be added as setters.
1 parent 5f2efbe commit f690a7f

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

web/src/main/java/org/springframework/security/web/authentication/preauth/x509/SubjectX500PrincipalExtractor.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,31 @@
3939
* format RFC1779 will be used: DN is extracted from EMAIlADDRESS.
4040
*
4141
* @author Max Batischev
42+
* @author Rob Winch
4243
* @since 7.0
4344
*/
4445
public final class SubjectX500PrincipalExtractor implements X509PrincipalExtractor, MessageSourceAware {
4546

4647
private final Log logger = LogFactory.getLog(getClass());
4748

48-
private MessageSourceAccessor messages = SpringSecurityMessageSource.getAccessor();
49+
private static final Pattern EMAIL_SUBJECT_DN_PATTERN = Pattern.compile("OID.1.2.840.113549.1.9.1=(.*?)(?:,|$)",
50+
Pattern.CASE_INSENSITIVE);
4951

50-
private boolean extractPrincipalNameFromEmail = false;
52+
private static final Pattern CN_SUBJECT_DN_PATTERN = Pattern.compile("CN=(.*?)(?:,|$)", Pattern.CASE_INSENSITIVE);
5153

52-
private final Pattern cnSubjectDnPattern = Pattern.compile("CN=(.*?)(?:,|$)", Pattern.CASE_INSENSITIVE);
54+
private MessageSourceAccessor messages = SpringSecurityMessageSource.getAccessor();
5355

54-
private final Pattern emailSubjectDnPattern = Pattern.compile("OID.1.2.840.113549.1.9.1=(.*?)(?:,|$)",
55-
Pattern.CASE_INSENSITIVE);
56+
private Pattern subjectDnPattern = CN_SUBJECT_DN_PATTERN;
57+
58+
private String x500PrincipalFormat = X500Principal.RFC2253;
5659

5760
@Override
5861
public Object extractPrincipal(X509Certificate clientCert) {
5962
Assert.notNull(clientCert, "clientCert cannot be null");
6063
X500Principal principal = clientCert.getSubjectX500Principal();
61-
String subjectDN = this.extractPrincipalNameFromEmail ? principal.getName("RFC1779") : principal.getName();
64+
String subjectDN = principal.getName(this.x500PrincipalFormat);
6265
this.logger.debug(LogMessage.format("Subject DN is '%s'", subjectDN));
63-
Matcher matcher = this.extractPrincipalNameFromEmail ? this.emailSubjectDnPattern.matcher(subjectDN)
64-
: this.cnSubjectDnPattern.matcher(subjectDN);
66+
Matcher matcher = this.subjectDnPattern.matcher(subjectDN);
6567
if (!matcher.find()) {
6668
throw new BadCredentialsException(this.messages.getMessage("SubjectX500PrincipalExtractor.noMatching",
6769
new Object[] { subjectDN }, "No matching pattern was found in subject DN: {0}"));
@@ -82,7 +84,14 @@ public void setMessageSource(MessageSource messageSource) {
8284
* @param extractPrincipalNameFromEmail whether to extract DN from EMAIlADDRESS
8385
*/
8486
public void setExtractPrincipalNameFromEmail(boolean extractPrincipalNameFromEmail) {
85-
this.extractPrincipalNameFromEmail = extractPrincipalNameFromEmail;
87+
if (extractPrincipalNameFromEmail) {
88+
this.subjectDnPattern = EMAIL_SUBJECT_DN_PATTERN;
89+
this.x500PrincipalFormat = X500Principal.RFC1779;
90+
}
91+
else {
92+
this.subjectDnPattern = CN_SUBJECT_DN_PATTERN;
93+
this.x500PrincipalFormat = X500Principal.RFC2253;
94+
}
8695
}
8796

8897
}

0 commit comments

Comments
 (0)