Spring Boot,如何将AuthenticationPrinciple从测试传递给控制器​​?

时间:2019-02-28 14:33:43

标签: spring-boot

我有一个Spring Boot 2 Web服务。它接受Bearer令牌,并使用Spring OAuth2转到外部URL,并使用该令牌获取用户详细信息。我正在尝试创建测试Web服务实现的测试,但是我正在努力找出如何从测试中传递AuthenticationPrinicple?

这是我的控制器中方法的一个示例;

@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity listUserUploadedFiles(@AuthenticationPrincipal Client client) {
        FileListResponse rsp = new FileListResponse(fileStorageService.getUserFiles(client.getUid()));

        return rsp.response(HttpStatus.OK);
    }

到目前为止,这是我的测试;

@Test
    public void TestSimple() throws Exception {
        mockMvc.perform(get("/file"))
                .andExpect(status().isOk());
    }

当前测试失败,因为客户端(AuthenticationPrinicple)为空。

我该怎么做?

----更新----

这是我的Client对象,如您所见,它不继承UserDetails。

public class Client implements Serializable {

    private static final long serialVersionUID = 1L;

    private String uid;
    private String email;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

还有一个PrincipalExtractor bean安装程序。

@Bean
    public PrincipalExtractor principalExtractor() {
        return map -> {
            Client client = new Client();
            client.setUid(String.valueOf(map.get("uid")));
            client.setEmail(String.valueOf(map.get("name")));

            return client;
        };
    }

提供有关该项目的更多信息。这是一个微服务,用户通过Web服务在该服务的外部进行身份验证。对该服务器进行调用时,将提供一个令牌,该令牌将通过身份验证服务器(再次是外部)进行验证。身份验证服务器的响应为我们提供了一个uuid和一个电子邮件字段,PrincipalExtractor将它们映射到一个Client对象,然后将其传递到要使用的控制器中。

1 个答案:

答案 0 :(得分:1)

您可以在测试@WithMockUser时嘲笑您的用户。

如果使用MockMvc,则不需要额外的sec配置

 @RunWith(SpringRunner.class)
 @WebMvcTest(SecuredController.class)
 public class SecuredControllerWebMvcIntegrationTest {

     @Autowired
     private MockMvc mockMvc;

     @Test
     @WithMockUser(value = "user")
     public void testSimple() throws Exception {
             mockMvc.perform(get("/file"))
                 ...

如果您想在@WithMockUser中使用@SpringBootTest,则需要进行额外的配置

 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 public class SecuredControllerSpringBootIntegrationTest
      ...
      @Autowired
      private WebApplicationContext context;

       private MockMvc mvc;

       @Before
       public void setup() {
            mvc = MockMvcBuilders
                   .webAppContextSetup(context)
                   .apply(springSecurity())
                   .build();
        }
 ...

ref spring-security-integration-tests