Summary
I would like to create a meta annotation for @WithMockUser from Spring Security Test that uses @AliasFor to set the username, but the aliased attribute does not work.
Actual Behavior
I created the following annotation. The goal is to have an annotation that has a role preset but still allows switching the username.
package com.example.security;
import org.springframework.core.annotation.AliasFor;
import org.springframework.security.test.context.support.WithMockUser;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@WithMockUser(roles = "APP_USER")
public @interface WithAppUser {
@AliasFor(annotation = WithMockUser.class, attribute = "value")
String value();
}
But when using this in a test like
@SpringBootTest
public class Test {
@Test
@WithAppUser("foo")
public void test() {
// some code that uses the principal
}
}
the username is the default value of @WithMockUser, "user".
Expected Behavior
The username should be "foo".
Configuration
A Spring Boot Webflux application with Spring Security.
Version
Spring Boot 2.1.5 with Spring Security starter, the Spring Boot test starter and Spring Security Test (5.1.5)
Sample
spring-security-withmockuser-alias.zip
Additional info
I'm guessing this is because here AnnotationUtils.findAnnotation is used but could be AnnotatedElementUtils
.findMergedAnnotation, though I am not aware of other implications that would have.
Comment From: MariuszCwikla
@FrontierPsychiatrist I think you are right. I have recently faced the same problem. I have tried your proposal and submitted a PR.
Comment From: rwinch
Thanks for the PR @MariuszCwikla I'm closing this in favor of the PR gh-11782