Add grantedAuthorityMapper as a class member

- Add unit tests for setGrantedAuthorityMapper method

Signed-off-by: dae won <eodnjs01477@gmail.com>
This commit is contained in:
dae won 2025-02-15 23:59:36 +09:00 committed by Josh Cummings
parent cb07031259
commit 45b51fe3c8
2 changed files with 43 additions and 9 deletions

View File

@ -159,6 +159,8 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
private RowMapper<UserDetails> userDetailsMapper = this::mapToUser; private RowMapper<UserDetails> userDetailsMapper = this::mapToUser;
private RowMapper<GrantedAuthority> grantedAuthorityMapper = this::mapToGrantedAuthority;
public JdbcUserDetailsManager() { public JdbcUserDetailsManager() {
} }
@ -182,6 +184,21 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
this.userDetailsMapper = mapper; this.userDetailsMapper = mapper;
} }
/**
* Sets the {@code RowMapper} to convert each authority result row into a
* {@link GrantedAuthority} object.
*
* The default mapper expects columns with names like 'authority' or 'role', and maps
* them directly to SimpleGrantedAuthority objects.
* @param mapper the {@code RowMapper} to use for mapping rows in the database to
* GrantedAuthority objects, must not be null
* @since 6.5
*/
public void setGrantedAuthorityMapper(RowMapper<GrantedAuthority> mapper) {
Assert.notNull(mapper, "grantedAuthorityMapper cannot be null");
this.grantedAuthorityMapper = mapper;
}
@Override @Override
protected void initDao() throws ApplicationContextException { protected void initDao() throws ApplicationContextException {
if (this.authenticationManager == null) { if (this.authenticationManager == null) {
@ -197,7 +214,7 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
*/ */
@Override @Override
protected List<UserDetails> loadUsersByUsername(String username) { protected List<UserDetails> loadUsersByUsername(String username) {
return getJdbcTemplate().query(getUsersByUsernameQuery(), userDetailsMapper, username); return getJdbcTemplate().query(getUsersByUsernameQuery(), this.userDetailsMapper, username);
} }
private UserDetails mapToUser(ResultSet rs, int rowNum) throws SQLException { private UserDetails mapToUser(ResultSet rs, int rowNum) throws SQLException {
@ -406,10 +423,10 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
this.logger.debug("Loading authorities for group '" + groupName + "'"); this.logger.debug("Loading authorities for group '" + groupName + "'");
Assert.hasText(groupName, "groupName should have text"); Assert.hasText(groupName, "groupName should have text");
return getJdbcTemplate().query(this.groupAuthoritiesSql, new String[] { groupName }, return getJdbcTemplate().query(this.groupAuthoritiesSql, new String[] { groupName },
this::mapToGrantedAuthority); this.grantedAuthorityMapper);
} }
protected GrantedAuthority mapToGrantedAuthority(ResultSet rs, int rowNum) throws SQLException { private GrantedAuthority mapToGrantedAuthority(ResultSet rs, int rowNum) throws SQLException {
String roleName = getRolePrefix() + rs.getString(3); String roleName = getRolePrefix() + rs.getString(3);
return new SimpleGrantedAuthority(roleName); return new SimpleGrantedAuthority(roleName);
} }

View File

@ -52,9 +52,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.BDDMockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.BDDMockito.verify;
import static org.mockito.Mockito.when;
/** /**
* Tests for {@link JdbcUserDetailsManager} * Tests for {@link JdbcUserDetailsManager}
@ -373,14 +372,14 @@ public class JdbcUserDetailsManagerTests {
@Test @Test
public void setUserDetailsMapperWithNullMapperThrowsException() { public void setUserDetailsMapperWithNullMapperThrowsException() {
assertThatExceptionOfType(IllegalArgumentException.class) assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> this.manager.setUserDetailsMapper(null)) .isThrownBy(() -> this.manager.setUserDetailsMapper(null))
.withMessage("userDetailsMapper cannot be null"); .withMessage("userDetailsMapper cannot be null");
} }
@Test @Test
public void setUserDetailsMapperWithMockMapper() throws SQLException { public void setUserDetailsMapperWithMockMapper() throws SQLException {
RowMapper<UserDetails> mockMapper = mock(RowMapper.class); RowMapper<UserDetails> mockMapper = mock(RowMapper.class);
when(mockMapper.mapRow(any(), anyInt())).thenReturn(joe); given(mockMapper.mapRow(any(), anyInt())).willReturn(joe);
this.manager.setUserDetailsMapper(mockMapper); this.manager.setUserDetailsMapper(mockMapper);
insertJoe(); insertJoe();
UserDetails newJoe = this.manager.loadUserByUsername("joe"); UserDetails newJoe = this.manager.loadUserByUsername("joe");
@ -388,6 +387,24 @@ public class JdbcUserDetailsManagerTests {
verify(mockMapper).mapRow(any(), anyInt()); verify(mockMapper).mapRow(any(), anyInt());
} }
@Test
public void setGrantedAuthorityMapperWithNullMapperThrowsException() {
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> this.manager.setGrantedAuthorityMapper(null))
.withMessage("grantedAuthorityMapper cannot be null");
}
@Test
public void setGrantedAuthorityMapperWithMockMapper() throws SQLException {
RowMapper<GrantedAuthority> mockMapper = mock(RowMapper.class);
GrantedAuthority mockAuthority = new SimpleGrantedAuthority("ROLE_MOCK");
given(mockMapper.mapRow(any(), anyInt())).willReturn(mockAuthority);
this.manager.setGrantedAuthorityMapper(mockMapper);
List<GrantedAuthority> authGroup = this.manager.findGroupAuthorities("GROUP_0");
assertThat(authGroup.get(0)).isEqualTo(mockAuthority);
verify(mockMapper).mapRow(any(), anyInt());
}
private Authentication authenticateJoe() { private Authentication authenticateJoe() {
UsernamePasswordAuthenticationToken auth = UsernamePasswordAuthenticationToken.authenticated("joe", "password", UsernamePasswordAuthenticationToken auth = UsernamePasswordAuthenticationToken.authenticated("joe", "password",
joe.getAuthorities()); joe.getAuthorities());