Spring Security AuthenticationSuccessHandler и MockMvc - PullRequest
0 голосов
/ 20 июня 2019

после успешной аутентификации я сохраняю аутентифицированного пользователя в течение сеанса. После этого я получаю пользователя в любом контроллере с помощью @SessionAttributes ("user")

Теперь я пытаюсь проверить это:


@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = SpringSecurityTestConfig.class
)
public class ProfileMetaDataControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private MyController myController;

    @Autowired
    private WebApplicationContext context;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
    }
    @Test
    @WithUserDetails("userMail@hotmail.com")
    public void shouldReturnDefaultMessage() throws Exception {
        String expectedValue ="greeting";
        MvcResult result = this.mockMvc.perform(get("/contentUrl")
                                .contentType(MediaType.TEXT_PLAIN)
                                .content("romakapt@gmx.de"))
                    .andDo(print())
                    .andExpect(content().string(expectedValue))
                    .andReturn();
     }
}

И мой контроллер, который будет проверен:

@RestController
@RequestMapping("/profile")
@SessionAttributes("user")
public class ProfileMetaDataController {

    @GetMapping("/contentUrl")
    @ResponseBody
    public List<String> getInformation(Model model) throws IOException {
        User user = Optional.ofNullable((User) model.asMap().get("user")); //User ist null!!!!
    }
}

Пользователь имеет значение null, потому что мой AuthenticationSuccessHandler никогда не вызывает метод onAuthenticationSuccess, где я храню пользователя в сеансе.

Как я могу справиться с этим? обычно UsernamePasswordAuthenticationFilter вызывает мой AuthenticationSuccessHandler, но не во время теста MockMVC.

1 Ответ

1 голос
/ 20 июня 2019

Если у вас нет другой причины, не используйте @SessionAttributes.Обычно пользователь аутентификации хранится в SecurityContextHolder следующим образом:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

Если вы хотите получить пользователя в контроллере, попробуйте 3 вещи.

public List<String> getInformation(@AuthenticationPrincipal YourUser youruser) {
    // ...
}

public List<String> getInformation(Principal principal) {
    YourUser youruser = (YourUser) principal;
    // ...
}

public List<String> getInformation(Authentication authentication) {
    YourUser youruser = (YourUser) authentication.getPrincipal();
    // ...
}
...