Skip to content

Commit 45b51fe

Browse files
big-cirjzheaux
authored andcommitted
Add grantedAuthorityMapper as a class member
- Add unit tests for setGrantedAuthorityMapper method Signed-off-by: dae won <[email protected]>
1 parent cb07031 commit 45b51fe

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java

+20-3
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
159159

160160
private RowMapper<UserDetails> userDetailsMapper = this::mapToUser;
161161

162+
private RowMapper<GrantedAuthority> grantedAuthorityMapper = this::mapToGrantedAuthority;
163+
162164
public JdbcUserDetailsManager() {
163165
}
164166

@@ -182,6 +184,21 @@ public void setUserDetailsMapper(RowMapper<UserDetails> mapper) {
182184
this.userDetailsMapper = mapper;
183185
}
184186

187+
/**
188+
* Sets the {@code RowMapper} to convert each authority result row into a
189+
* {@link GrantedAuthority} object.
190+
*
191+
* The default mapper expects columns with names like 'authority' or 'role', and maps
192+
* them directly to SimpleGrantedAuthority objects.
193+
* @param mapper the {@code RowMapper} to use for mapping rows in the database to
194+
* GrantedAuthority objects, must not be null
195+
* @since 6.5
196+
*/
197+
public void setGrantedAuthorityMapper(RowMapper<GrantedAuthority> mapper) {
198+
Assert.notNull(mapper, "grantedAuthorityMapper cannot be null");
199+
this.grantedAuthorityMapper = mapper;
200+
}
201+
185202
@Override
186203
protected void initDao() throws ApplicationContextException {
187204
if (this.authenticationManager == null) {
@@ -197,7 +214,7 @@ protected void initDao() throws ApplicationContextException {
197214
*/
198215
@Override
199216
protected List<UserDetails> loadUsersByUsername(String username) {
200-
return getJdbcTemplate().query(getUsersByUsernameQuery(), userDetailsMapper, username);
217+
return getJdbcTemplate().query(getUsersByUsernameQuery(), this.userDetailsMapper, username);
201218
}
202219

203220
private UserDetails mapToUser(ResultSet rs, int rowNum) throws SQLException {
@@ -406,10 +423,10 @@ public List<GrantedAuthority> findGroupAuthorities(String groupName) {
406423
this.logger.debug("Loading authorities for group '" + groupName + "'");
407424
Assert.hasText(groupName, "groupName should have text");
408425
return getJdbcTemplate().query(this.groupAuthoritiesSql, new String[] { groupName },
409-
this::mapToGrantedAuthority);
426+
this.grantedAuthorityMapper);
410427
}
411428

412-
protected GrantedAuthority mapToGrantedAuthority(ResultSet rs, int rowNum) throws SQLException {
429+
private GrantedAuthority mapToGrantedAuthority(ResultSet rs, int rowNum) throws SQLException {
413430
String roleName = getRolePrefix() + rs.getString(3);
414431
return new SimpleGrantedAuthority(roleName);
415432
}

core/src/test/java/org/springframework/security/provisioning/JdbcUserDetailsManagerTests.java

+23-6
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@
5252
import static org.mockito.ArgumentMatchers.any;
5353
import static org.mockito.ArgumentMatchers.anyInt;
5454
import static org.mockito.BDDMockito.given;
55-
import static org.mockito.Mockito.mock;
56-
import static org.mockito.Mockito.verify;
57-
import static org.mockito.Mockito.when;
55+
import static org.mockito.BDDMockito.mock;
56+
import static org.mockito.BDDMockito.verify;
5857

5958
/**
6059
* Tests for {@link JdbcUserDetailsManager}
@@ -373,21 +372,39 @@ public void createNewAuthenticationUsesNullPasswordToKeepPassordsSave() {
373372
@Test
374373
public void setUserDetailsMapperWithNullMapperThrowsException() {
375374
assertThatExceptionOfType(IllegalArgumentException.class)
376-
.isThrownBy(() -> this.manager.setUserDetailsMapper(null))
377-
.withMessage("userDetailsMapper cannot be null");
375+
.isThrownBy(() -> this.manager.setUserDetailsMapper(null))
376+
.withMessage("userDetailsMapper cannot be null");
378377
}
379378

380379
@Test
381380
public void setUserDetailsMapperWithMockMapper() throws SQLException {
382381
RowMapper<UserDetails> mockMapper = mock(RowMapper.class);
383-
when(mockMapper.mapRow(any(), anyInt())).thenReturn(joe);
382+
given(mockMapper.mapRow(any(), anyInt())).willReturn(joe);
384383
this.manager.setUserDetailsMapper(mockMapper);
385384
insertJoe();
386385
UserDetails newJoe = this.manager.loadUserByUsername("joe");
387386
assertThat(joe).isEqualTo(newJoe);
388387
verify(mockMapper).mapRow(any(), anyInt());
389388
}
390389

390+
@Test
391+
public void setGrantedAuthorityMapperWithNullMapperThrowsException() {
392+
assertThatExceptionOfType(IllegalArgumentException.class)
393+
.isThrownBy(() -> this.manager.setGrantedAuthorityMapper(null))
394+
.withMessage("grantedAuthorityMapper cannot be null");
395+
}
396+
397+
@Test
398+
public void setGrantedAuthorityMapperWithMockMapper() throws SQLException {
399+
RowMapper<GrantedAuthority> mockMapper = mock(RowMapper.class);
400+
GrantedAuthority mockAuthority = new SimpleGrantedAuthority("ROLE_MOCK");
401+
given(mockMapper.mapRow(any(), anyInt())).willReturn(mockAuthority);
402+
this.manager.setGrantedAuthorityMapper(mockMapper);
403+
List<GrantedAuthority> authGroup = this.manager.findGroupAuthorities("GROUP_0");
404+
assertThat(authGroup.get(0)).isEqualTo(mockAuthority);
405+
verify(mockMapper).mapRow(any(), anyInt());
406+
}
407+
391408
private Authentication authenticateJoe() {
392409
UsernamePasswordAuthenticationToken auth = UsernamePasswordAuthenticationToken.authenticated("joe", "password",
393410
joe.getAuthorities());

0 commit comments

Comments
 (0)