Forráskód Böngészése

Add grantedAuthorityMapper as a class member
- Add unit tests for setGrantedAuthorityMapper method

Signed-off-by: dae won <eodnjs01477@gmail.com>

dae won 6 hónapja
szülő
commit
45b51fe3c8

+ 20 - 3
core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java

@@ -159,6 +159,8 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
 
 	private RowMapper<UserDetails> userDetailsMapper = this::mapToUser;
 
+	private RowMapper<GrantedAuthority> grantedAuthorityMapper = this::mapToGrantedAuthority;
+
 	public JdbcUserDetailsManager() {
 	}
 
@@ -182,6 +184,21 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
 		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
 	protected void initDao() throws ApplicationContextException {
 		if (this.authenticationManager == null) {
@@ -197,7 +214,7 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
 	 */
 	@Override
 	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 {
@@ -406,10 +423,10 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
 		this.logger.debug("Loading authorities for group '" + groupName + "'");
 		Assert.hasText(groupName, "groupName should have text");
 		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);
 		return new SimpleGrantedAuthority(roleName);
 	}

+ 23 - 6
core/src/test/java/org/springframework/security/provisioning/JdbcUserDetailsManagerTests.java

@@ -52,9 +52,8 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.BDDMockito.mock;
+import static org.mockito.BDDMockito.verify;
 
 /**
  * Tests for {@link JdbcUserDetailsManager}
@@ -373,14 +372,14 @@ public class JdbcUserDetailsManagerTests {
 	@Test
 	public void setUserDetailsMapperWithNullMapperThrowsException() {
 		assertThatExceptionOfType(IllegalArgumentException.class)
-				.isThrownBy(() -> this.manager.setUserDetailsMapper(null))
-				.withMessage("userDetailsMapper cannot be null");
+			.isThrownBy(() -> this.manager.setUserDetailsMapper(null))
+			.withMessage("userDetailsMapper cannot be null");
 	}
 
 	@Test
 	public void setUserDetailsMapperWithMockMapper() throws SQLException {
 		RowMapper<UserDetails> mockMapper = mock(RowMapper.class);
-		when(mockMapper.mapRow(any(), anyInt())).thenReturn(joe);
+		given(mockMapper.mapRow(any(), anyInt())).willReturn(joe);
 		this.manager.setUserDetailsMapper(mockMapper);
 		insertJoe();
 		UserDetails newJoe = this.manager.loadUserByUsername("joe");
@@ -388,6 +387,24 @@ public class JdbcUserDetailsManagerTests {
 		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() {
 		UsernamePasswordAuthenticationToken auth = UsernamePasswordAuthenticationToken.authenticated("joe", "password",
 				joe.getAuthorities());