|
@@ -6,6 +6,11 @@ import org.springframework.beans.factory.support.RootBeanDefinition;
|
|
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
|
|
import org.springframework.beans.factory.xml.ParserContext;
|
|
|
import org.springframework.security.providers.dao.DaoAuthenticationProvider;
|
|
|
+import org.springframework.security.providers.encoding.Md4PasswordEncoder;
|
|
|
+import org.springframework.security.providers.encoding.Md5PasswordEncoder;
|
|
|
+import org.springframework.security.providers.encoding.PasswordEncoder;
|
|
|
+import org.springframework.security.providers.encoding.PlaintextPasswordEncoder;
|
|
|
+import org.springframework.security.providers.encoding.ShaPasswordEncoder;
|
|
|
import org.springframework.security.userdetails.jdbc.JdbcUserDetailsManager;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
import org.springframework.util.xml.DomUtils;
|
|
@@ -21,10 +26,20 @@ import org.w3c.dom.Element;
|
|
|
*/
|
|
|
class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
|
- static final String ATT_CREATE_PROVIDER = "createProvider";
|
|
|
static final String ATT_DATA_SOURCE = "dataSource";
|
|
|
static final String ATT_ID = "id";
|
|
|
+
|
|
|
+ static final String ATT_CREATE_PROVIDER = "createProvider";
|
|
|
static final String DEF_CREATE_PROVIDER = "true";
|
|
|
+
|
|
|
+ static final String ATT_HASH = "hash";
|
|
|
+ static final String DEF_HASH_PLAINTEXT = "plaintext";
|
|
|
+ static final String OPT_HASH_SHA_HEX = "sha:hex";
|
|
|
+ static final String OPT_HASH_SHA_BASE64 = "sha:base64";
|
|
|
+ static final String OPT_HASH_MD4_HEX = "md4:hex";
|
|
|
+ static final String OPT_HASH_MD4_BASE64 = "md4:base64";
|
|
|
+ static final String OPT_HASH_MD5_HEX = "md5:hex";
|
|
|
+ static final String OPT_HASH_MD5_BASE64 = "md5:base64";
|
|
|
|
|
|
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
|
|
boolean createProvider = true;
|
|
@@ -43,7 +58,7 @@ class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
|
|
|
if (userServiceElt != null) {
|
|
|
BeanDefinition userDetailsService = new UserServiceBeanDefinitionParser().parse(userServiceElt, parserContext);
|
|
|
- createDaoAuthenticationProviderIfRequired(createProvider, userDetailsService, parserContext);
|
|
|
+ createDaoAuthenticationProviderIfRequired(createProvider, userServiceElt.getAttribute(ATT_HASH), userDetailsService, parserContext);
|
|
|
}
|
|
|
|
|
|
if (jdbcUserServiceElt != null) {
|
|
@@ -54,22 +69,50 @@ class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
// An explicit dataSource was specified, so use it
|
|
|
builder.addPropertyReference("dataSource", dataSource);
|
|
|
parserContext.getRegistry().registerBeanDefinition(BeanIds.JDBC_USER_DETAILS_MANAGER, builder.getBeanDefinition());
|
|
|
- createDaoAuthenticationProviderIfRequired(createProvider, builder.getBeanDefinition(), parserContext);
|
|
|
+ createDaoAuthenticationProviderIfRequired(createProvider, jdbcUserServiceElt.getAttribute(ATT_HASH), builder.getBeanDefinition(), parserContext);
|
|
|
}
|
|
|
|
|
|
if (customUserServiceElt != null) {
|
|
|
String id = customUserServiceElt.getAttribute(ATT_ID);
|
|
|
BeanDefinition userDetailsService = parserContext.getRegistry().getBeanDefinition(id);
|
|
|
- createDaoAuthenticationProviderIfRequired(createProvider, userDetailsService, parserContext);
|
|
|
+ createDaoAuthenticationProviderIfRequired(createProvider, customUserServiceElt.getAttribute(ATT_HASH), userDetailsService, parserContext);
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private void createDaoAuthenticationProviderIfRequired(boolean createProvider, BeanDefinition userDetailsService, ParserContext parserContext) {
|
|
|
+ private void createDaoAuthenticationProviderIfRequired(boolean createProvider, String hash, BeanDefinition userDetailsService, ParserContext parserContext) {
|
|
|
if (createProvider) {
|
|
|
+ if (!StringUtils.hasText(hash)) {
|
|
|
+ hash = DEF_HASH_PLAINTEXT;
|
|
|
+ }
|
|
|
RootBeanDefinition authProvider = new RootBeanDefinition(DaoAuthenticationProvider.class);
|
|
|
authProvider.getPropertyValues().addPropertyValue("userDetailsService", userDetailsService);
|
|
|
+
|
|
|
+ PasswordEncoder pwdEnc = null;
|
|
|
+ if (OPT_HASH_MD4_HEX.equals(hash)) {
|
|
|
+ pwdEnc = new Md4PasswordEncoder();
|
|
|
+ ((Md4PasswordEncoder)pwdEnc).setEncodeHashAsBase64(false);
|
|
|
+ } else if (OPT_HASH_MD4_BASE64.equals(hash)) {
|
|
|
+ pwdEnc = new Md4PasswordEncoder();
|
|
|
+ ((Md4PasswordEncoder)pwdEnc).setEncodeHashAsBase64(true);
|
|
|
+ } else if (OPT_HASH_MD5_HEX.equals(hash)) {
|
|
|
+ pwdEnc = new Md5PasswordEncoder();
|
|
|
+ ((Md5PasswordEncoder)pwdEnc).setEncodeHashAsBase64(false);
|
|
|
+ } else if (OPT_HASH_MD5_BASE64.equals(hash)) {
|
|
|
+ pwdEnc = new Md5PasswordEncoder();
|
|
|
+ ((Md5PasswordEncoder)pwdEnc).setEncodeHashAsBase64(true);
|
|
|
+ } else if (OPT_HASH_SHA_HEX.equals(hash)) {
|
|
|
+ pwdEnc = new ShaPasswordEncoder();
|
|
|
+ ((ShaPasswordEncoder)pwdEnc).setEncodeHashAsBase64(false);
|
|
|
+ } else if (OPT_HASH_SHA_BASE64.equals(hash)) {
|
|
|
+ pwdEnc = new ShaPasswordEncoder();
|
|
|
+ ((ShaPasswordEncoder)pwdEnc).setEncodeHashAsBase64(true);
|
|
|
+ } else {
|
|
|
+ pwdEnc = new PlaintextPasswordEncoder();
|
|
|
+ }
|
|
|
+ authProvider.getPropertyValues().addPropertyValue("passwordEncoder", pwdEnc);
|
|
|
+
|
|
|
ConfigUtils.getRegisteredProviders(parserContext).add(authProvider);
|
|
|
}
|
|
|
}
|