mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-05-31 09:12:14 +00:00
SEC-2984: Add @WithMockUser authorities property
This commit is contained in:
parent
08b1b56e2c
commit
e4517016ca
@ -70,14 +70,33 @@ public @interface WithMockUser {
|
||||
String username() default "";
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* The roles to use. The default is "USER". A {@link GrantedAuthority} will be created
|
||||
* for each value within roles. Each value in roles will automatically be prefixed
|
||||
* with "ROLE_". For example, the default will result in "ROLE_USER" being used.
|
||||
* </p>
|
||||
* <p>
|
||||
* If {@link #authorities()} is specified this property cannot be changed from the default.
|
||||
* </p>
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String[] roles() default { "USER" };
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* The authorities to use. A {@link GrantedAuthority} will be created for each value.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* If this property is specified then {@link #roles()} is not used. This differs from
|
||||
* {@link #roles()} in that it does not prefix the values passed in automatically.
|
||||
* </p>
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String[] authorities() default {};
|
||||
|
||||
/**
|
||||
* The password to be used. The default is "password".
|
||||
* @return
|
||||
|
@ -16,6 +16,7 @@
|
||||
package org.springframework.security.test.context.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
@ -44,16 +45,26 @@ final class WithMockUserSecurityContextFactory implements
|
||||
throw new IllegalArgumentException(withUser
|
||||
+ " cannot have null username on both username and value properites");
|
||||
}
|
||||
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
|
||||
for (String role : withUser.roles()) {
|
||||
if (role.startsWith("ROLE_")) {
|
||||
throw new IllegalArgumentException("roles cannot start with ROLE_ Got "
|
||||
+ role);
|
||||
}
|
||||
authorities.add(new SimpleGrantedAuthority("ROLE_" + role));
|
||||
|
||||
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
|
||||
for (String authority : withUser.authorities()) {
|
||||
grantedAuthorities.add(new SimpleGrantedAuthority(authority));
|
||||
}
|
||||
|
||||
if(grantedAuthorities.isEmpty()) {
|
||||
for (String role : withUser.roles()) {
|
||||
if (role.startsWith("ROLE_")) {
|
||||
throw new IllegalArgumentException("roles cannot start with ROLE_ Got "
|
||||
+ role);
|
||||
}
|
||||
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_" + role));
|
||||
}
|
||||
} else if(!(withUser.roles().length == 1 && "USER".equals(withUser.roles()[0]))) {
|
||||
throw new IllegalStateException("You cannot define roles attribute "+ Arrays.asList(withUser.roles())+" with authorities attribute "+ Arrays.asList(withUser.authorities()));
|
||||
}
|
||||
|
||||
User principal = new User(username, withUser.password(), true, true, true, true,
|
||||
authorities);
|
||||
grantedAuthorities);
|
||||
Authentication authentication = new UsernamePasswordAuthenticationToken(
|
||||
principal, principal.getPassword(), principal.getAuthorities());
|
||||
SecurityContext context = SecurityContextHolder.createEmptyContext();
|
||||
|
@ -67,6 +67,13 @@ public class WithMockUserTests {
|
||||
.contains("ROLE_ADMIN");
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockUser(username = "admin", authorities = { "ADMIN", "USER" })
|
||||
public void getMessageWithMockUserCustomAuthorities() {
|
||||
String message = messageService.getMessage();
|
||||
assertThat(message).contains("admin").contains("ADMIN").contains("USER").doesNotContain("ROLE_");
|
||||
}
|
||||
|
||||
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
||||
@ComponentScan(basePackageClasses = HelloMessageService.class)
|
||||
static class Config {
|
||||
|
@ -47,6 +47,7 @@ public class WithMockUserSecurityContextFactoryTests {
|
||||
when(withUser.value()).thenReturn("valueUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "USER" });
|
||||
when(withUser.authorities()).thenReturn(new String[] {});
|
||||
|
||||
assertThat(factory.createSecurityContext(withUser).getAuthentication().getName())
|
||||
.isEqualTo(withUser.value());
|
||||
@ -58,6 +59,7 @@ public class WithMockUserSecurityContextFactoryTests {
|
||||
when(withUser.username()).thenReturn("customUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "USER" });
|
||||
when(withUser.authorities()).thenReturn(new String[] {});
|
||||
|
||||
assertThat(factory.createSecurityContext(withUser).getAuthentication().getName())
|
||||
.isEqualTo(withUser.username());
|
||||
@ -68,6 +70,7 @@ public class WithMockUserSecurityContextFactoryTests {
|
||||
when(withUser.value()).thenReturn("valueUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "USER", "CUSTOM" });
|
||||
when(withUser.authorities()).thenReturn(new String[] {});
|
||||
|
||||
assertThat(
|
||||
factory.createSecurityContext(withUser).getAuthentication()
|
||||
@ -75,11 +78,35 @@ public class WithMockUserSecurityContextFactoryTests {
|
||||
"ROLE_USER", "ROLE_CUSTOM");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authoritiesWorks() {
|
||||
when(withUser.value()).thenReturn("valueUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "USER" });
|
||||
when(withUser.authorities()).thenReturn(new String[] { "USER", "CUSTOM" });
|
||||
|
||||
assertThat(
|
||||
factory.createSecurityContext(withUser).getAuthentication()
|
||||
.getAuthorities()).onProperty("authority").containsOnly(
|
||||
"USER", "CUSTOM");
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void authoritiesAndRolesInvalid() {
|
||||
when(withUser.value()).thenReturn("valueUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "CUSTOM" });
|
||||
when(withUser.authorities()).thenReturn(new String[] { "USER", "CUSTOM" });
|
||||
|
||||
factory.createSecurityContext(withUser);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void rolesWithRolePrefixFails() {
|
||||
when(withUser.value()).thenReturn("valueUser");
|
||||
when(withUser.password()).thenReturn("password");
|
||||
when(withUser.roles()).thenReturn(new String[] { "ROLE_FAIL" });
|
||||
when(withUser.authorities()).thenReturn(new String[] {});
|
||||
|
||||
factory.createSecurityContext(withUser);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user