Я слишком долго рылся в сообщениях и получал головокружение, поэтому я надеюсь, что один из гуру может помочь мне в этом.Контейнер управляемый auth, ручка в настоящее время зарегистрированный пользователь
Я использую аутентификацию, управляемую контейнером, и она работает хорошо. У меня есть мои настройки Realm для проверки подлинности, установите Защищенные URLs в web.xml, есть страницы входа в систему и т.д.
Но теперь я ударяя проблема ...
У меня есть объекты JPA для моей модели данных и некоторые из этих объектов «проверяются» в том, что они отслеживают, когда они были созданы или обновлены, и , кто.
Я использую @PrePersist
обработчик в моем коде, чтобы установить createdOn
и updatedOn
поля на упорствовать/обновление соответственно, например, так:
@PrePersist
protected void onCreate() {
this.setCreatedOn(new Date());
}
Это прекрасно работает, но мне не хватает, как я должен получить доступ для пользователя, который в настоящее время вошёл в систему отсюда ... Мне нужно это, чтобы установить поле createdBy
.
Я использую Resteasy и в моей конечной точке у меня есть доступ к вошедшему пользователю, и я смог получить свой объект Account:
@Path("/test")
public class TestEndpoint {
@EJB
AuthorizationService authService;
@GET
@Path("path")
@Produces("application/json")
@RolesAllowed("User")
public Response test() {
Account account = authService.getLoggedInAccount();
return account == null ? Response.status(Status.NOT_FOUND).build() : Response.ok().entity(account).build();
}
}
AuthorizationService это мой и выглядит следующим образом:
@Stateless
@LocalBean
public class AuthorizationService {
@Inject
HttpServletRequest request;
public Account getLoggedInAccount() {
Account result = (Account) request.getAttribute(LOGGED_IN_USER);
if (result == null) {
Principal principal = request.getUserPrincipal();
if (principal != null) {
List<Account> results = crudService.find(Account.BY_NAME, Params.of("name", principal.getName()), 0, 0);
if (results != null && results.size() > 0) {
result = results.get(0);
request.setAttribute(LOGGED_IN_USER, result);
}
}
}
return result;
}
}
Это работает. Обратите внимание, что я кэширую зарегистрированного пользователя в атрибуте запроса, поэтому я не отправляю запрос в базу данных каждый раз.
До сих пор я был в состоянии получить с этой установкой, но я чувствую, что я делаю это все неправильно ...
Я хотел бы иметь одну глобальную точку перехвата (фильтр?), Где я заселить. ..something ... (запрос?) с текущим именем пользователя учетной записи пользователя, а затем иметь возможность вводить его там, где это необходимо ... Я бы очень хотел, чтобы решения, которые не создают сеанс, поскольку я пытаюсь сделать приложение как можно более масштабируемое.
Любые советы о том, как справиться с этим? Эта золотая ссылка на учебник, который объясняет это хорошо, может быть? Спасибо за помощь!
Спасибо. это звучит как шаг вперед. Интересно, однако, если бы я мог сделать свой собственный класс Аккаунта доступным для инъекций? Было бы более удобно, чем использовать Принципала, чтобы получить его каждый раз. –
В приведенной ссылке есть фрагмент кода, который иллюстрирует инъекцию пользователя: '@Inject private User user;'. Однако как сделать доступным для входа в систему пользователя для инъекций? –
Контейнер несет ответственность за установку текущего пользователя в «Принципал». Поэтому, когда вы объявляете '@Inject Principal' в безопасном контексте JEE, основной экземпляр сопоставляется с текущим пользователем. Для особенностей дельта-шипа вы можете сделать что-то вроде: '@Inject private Principal Princip; @Produces @CurrentUser public String currentUser() { return main! = Null? Princip.getName(): "anonymous"; } ' – Franck