Что такое альтернатива @AuthenticationPrincipal для микронавтов? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь получить UserDetails объект, как показано ниже.Но у меня есть некоторые трудности и невозможно получить UserDetails объект, поэтому в authentication.getAttributes() есть только JSONObject.Есть ли какой-нибудь альтернативный способ в микроавтобусе получить UserDetails объект?

Пользовательский UserDetails объект:

public class MyUserPrincipal implements UserDetails {
    private Account account;

    public MyUserPrincipal(Account account) {
        this.account = account;
    }

    public Account getAccount() {
        return getAccount();
    }

}

Rest api:

//micronaut
@Post(value = "/echo")
@Status(HttpStatus.OK)
public Long echo(@Nullable Authentication authentication) {
    Long accountId = (Long)((JSONObject)authentication.getAttributes().get("account")).get("id");
    return accountId;
}

Например, вSpring Security легко с аннотацией @AuthenticationPrincipal в параметре.

Rest api:

@GET
public ResponseEntity<?> echo(@AuthenticationPrincipal MyUserPrincipal user) {
    return new ResponseEntity<>(user.getAccount().getAccountId(), HttpStatus.OK);
}

1 Ответ

0 голосов
/ 12 февраля 2019

UserDetails не существует после аутентификации.Единственный доступный объект - Аутентификация.Если вы хотите стандартизировать приведенный выше код, вы можете создать bean-компонент, который обрабатывает внедрение этого конкретного свойства.

Вы можете использовать аннотацию для обозначения внедрения, создавая аннотацию вместе с реализацией AnnotatedRequestArgumentBinder,Примерно так:

public class Temp implements AnnotatedRequestArgumentBinder<YourAnnotation, Long> {

    @Override
    public Class<YourAnnotation> getAnnotationType() {
        return YourAnnotation.class;
    }

    @Override
    public BindingResult<Long> bind(ArgumentConversionContext<Long> context, HttpRequest<?> source) {
        if (source.getAttributes().contains(OncePerRequestHttpServerFilter.getKey(SecurityFilter.class))) {
            final Optional<Authentication> authentication = source.getUserPrincipal(Authentication.class);
            if (authentication.isPresent()) {
                return () -> (Long)((JSONObject)authentication.getAttributes().get("account")).get("id");
            }
        }

        return ArgumentBinder.BindingResult.EMPTY;
    }
}
...