Я заметил, что когда я заменяю объект Authentication в RunAsManager, аргументы метода разрешаемого контроллера (Authentication
, Principal
и @AuthenticationPrincipal
) игнорируют новый объект Authentication и получают исходный.
Примеры (все 4 метода находятся в одном контроллере)
Это разрешает правильную (runAs) аутентификацию:
@Secured({"ROLE_ADMIN", "ROLE_WORKFLOW", "RUN_AS_USER"})
@PostMapping("/testRunAs")
public ResponseEntity<Result> testRunAs() {
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
log.debug(authentication.getPrincipal().toString()); // correct
...
Это разрешениенеправильно (оригинал) Аутентификация:
@Secured({"ROLE_ADMIN", "ROLE_WORKFLOW", "RUN_AS_USER"})
@PostMapping("/testRunAs1")
public ResponseEntity<Result> testRunAs1(Authentication authentication) {
log.debug(authentication.getPrincipal().toString()); // wrong
...
@Secured({"ROLE_ADMIN", "ROLE_WORKFLOW", "RUN_AS_USER"})
@PostMapping("/testRunAs2")
public ResponseEntity<Result> testRunAs2(Principal principal) {
log.debug(principal.toString()); // wrong
...
@Secured({"ROLE_ADMIN", "ROLE_WORKFLOW", "RUN_AS_USER"})
@PostMapping("/testRunAs3")
public ResponseEntity<Result> testRunAs3(@AuthenticationPrincipal User u) {
log.debug(u.toString()); // wrong
...
Как это возможно?
resolveArgument
* * * * * * * * * * * * * * * *
* * * * * * * * *1037* * * * runAs
* * * *1031* * * *1031* * * *1031* * * * * * * * * * * * *1031* Похоже, аргумент Resolver выполняется до замены runAs, хотя я не могу подтвердить это с помощью отладчика (каким-то образом не могу достичь точки останова в AuthenticationPrincipalArgumentResolver
)
Это ожидаемое поведение?
Примечание: я нахожусь на Spring Security 4.2.3.RELEASE