diff --git a/core/src/main/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.java b/core/src/main/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.java index 34f7834285..f84eefefa2 100644 --- a/core/src/main/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.java +++ b/core/src/main/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.java @@ -110,7 +110,8 @@ import org.springframework.util.Assert; * @author colin sampaleanu * @author Luke Taylor */ -public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, MessageSourceAware { +public class JdbcDaoImpl extends JdbcDaoSupport + implements UserDetailsService, MessageSourceAware { // ~ Static fields/initializers // ===================================================================================== @@ -126,8 +127,7 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M // ~ Instance fields // ================================================================================================ - protected final MessageSourceAccessor messages = SpringSecurityMessageSource - .getAccessor(); + protected MessageSourceAccessor messages = SpringSecurityMessageSource.getAccessor(); private String authoritiesByUsernameQuery; private String groupAuthoritiesByUsernameQuery; @@ -149,6 +149,13 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M // ~ Methods // ======================================================================================================== + /** + * @return the messages + */ + protected MessageSourceAccessor getMessages() { + return this.messages; + } + /** * Allows subclasses to add their own granted authorities to the list to be returned * in the UserDetails. @@ -171,6 +178,7 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M "Use of either authorities or groups must be enabled"); } + @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { List users = loadUsersByUsername(username); @@ -218,6 +226,7 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M protected List loadUsersByUsername(String username) { return getJdbcTemplate().query(this.usersByUsernameQuery, new String[] { username }, new RowMapper() { + @Override public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException { String username = rs.getString(1); @@ -238,6 +247,7 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M protected List loadUserAuthorities(String username) { return getJdbcTemplate().query(this.authoritiesByUsernameQuery, new String[] { username }, new RowMapper() { + @Override public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException { String roleName = JdbcDaoImpl.this.rolePrefix + rs.getString(2); @@ -256,6 +266,7 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M protected List loadGroupAuthorities(String username) { return getJdbcTemplate().query(this.groupAuthoritiesByUsernameQuery, new String[] { username }, new RowMapper() { + @Override public GrantedAuthority mapRow(ResultSet rs, int rowNum) throws SQLException { String roleName = getRolePrefix() + rs.getString(3); @@ -395,8 +406,10 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, M public void setEnableGroups(boolean enableGroups) { this.enableGroups = enableGroups; } - + + @Override public void setMessageSource(MessageSource messageSource) { + Assert.notNull(messageSource, "messageSource cannot be null"); this.messages = new MessageSourceAccessor(messageSource); } } diff --git a/core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java b/core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java index 6ae95f12cc..1290acca98 100644 --- a/core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java +++ b/core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java @@ -16,8 +16,11 @@ package org.springframework.security.core.userdetails.jdbc; +import java.util.Locale; + import org.junit.Test; +import org.springframework.context.MessageSource; import org.springframework.security.PopulatedDatabase; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; @@ -25,6 +28,10 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; /** * Tests {@link JdbcDaoImpl}. @@ -69,7 +76,8 @@ public class JdbcDaoImplTests { } @Test - public void testCheckDaoOnlyReturnsGrantedAuthoritiesGrantedToUser() throws Exception { + public void testCheckDaoOnlyReturnsGrantedAuthoritiesGrantedToUser() + throws Exception { JdbcDaoImpl dao = makePopulatedJdbcDao(); UserDetails user = dao.loadUserByUsername("scott"); assertThat(user.getAuthorities()).hasSize(1); @@ -187,4 +195,23 @@ public class JdbcDaoImplTests { } } + + @Test(expected = IllegalArgumentException.class) + public void setMessageSourceWhenNullThenThrowsException() throws Exception { + JdbcDaoImpl dao = new JdbcDaoImpl(); + + dao.setMessageSource(null); + } + + @Test + public void setMessageSourceWhenNotNullThenCanGet() throws Exception { + MessageSource source = mock(MessageSource.class); + JdbcDaoImpl dao = new JdbcDaoImpl(); + dao.setMessageSource(source); + String code = "code"; + + dao.getMessages().getMessage(code); + + verify(source).getMessage(eq(code), any(Object[].class), any(Locale.class)); + } }