Использование фронта на Angular

Добрый день.

Имеем приложение написанное CubaPlatform с использованием стандартного GenericUI. В приложении есть аналог личного кабинета. Появилась потребность разработать версию этого личного кабинета на Angular. Также есть требование одинарного входа в приложение. То есть, залогинившись в GenericUI, мы должны перейти по ссылке “новая версия кабинета” на страницу фронтового приложения, но продолжать работать от этого же пользователя, сохранив его роль и группу доступа.

Отсюда родились вопросы:
Как лучше реализовать взаимодействие фронта с бэком кубы: через RestAPI или кастомные контроллеры?
Есть ли возможность в RestAPI аутентифицировать и авторизовывать пользователя по ID сессии, а не через выпуск токенов?
Если использовать кастомные контроллеры, то как лучше их встроить в приложение? Через модуль portal или через модуль фронтенд-интерфейс?
Как обеспечить сквозную аутентификацию/авторизацию пользователя?

Заранее спасибо за ответы.

2 симпатии

Здравствуйте

Как лучше реализовать взаимодействие фронта с бэком кубы: через RestAPI или кастомные контроллеры?

Зависит от задачи - если предполагается наличие CRUD экранов по модели данных, то имеет смысл использовать REST API. Если интерфейс предполагает в основном вызов бизнес методов то лучше остаться в рамках контроллеров.

Есть ли возможность в RestAPI аутентифицировать и авторизовывать пользователя по ID сессии, а не через выпуск токенов?

Если имеется в виду по cookies то “из коробки” такой возможности нет, точно сказать можно ли этого добиться путем переопределения бинов платформы можно после некоторого ресёрча.

Если использовать кастомные контроллеры, то как лучше их встроить в приложение? Через модуль portal или через модуль фронтенд-интерфейс?

В модуле web или portal - в зависимости от потребностей разворачивания и удобства разработки. Фронтенд-интерфейс - это чисто клиентское приложение.

Как обеспечить сквозную аутентификацию/авторизацию пользователя?

Зависит от того выберете ли вы REST или кастомные контроллеры а также от того будут ли оба приложения на одном домене.

Добрый день.
Приложения на одном домене (CORS).
Интерфейс предполагает вызовы бизнес-методов.
Интересует вариант по cookies с минимальными доработками, как наиболее секьюрный.
Ресёрч можно провести в рамках нашего договора консалтинга (через Евгения Дегтярева).
Будем ждать результатов.

В рамках изучения темы добавил в проект модуль portal, в котором реализовал спринговые рест котроллеры. Пробую реализовать контроллер, который будет обрабатывать post-запрос с переданными в теле логином и паролем и выполнять логин пользователя.

@RestController
public class CustomLoginController {
    @PostMapping("/login2")
    public ResponseEntity<String> login(@RequestBody LoginUserCommand loginUserCommand) {
        Connection connection = App.getInstance().getConnection();
        String remoteAddr = App.getInstance().getRequest().getRemoteAddr();
        connection.login(loginUserCommand.getLogin(), loginUserCommand.getPassword(), Locale.getDefault(), remoteAddr, "");

        return new ResponseEntity<>(HttpStatus.OK);
    }
}

csrf-защиту отключил в portal-security-spring.xml.
В результате выполнения запроса, судя по логам приложения, пользователь выполняет успешный логин. В ответе на запрос приходит сессионная кука. Затем выполняю запрос к контроллеру с бизнес логикой с этой кукой, получаю редирект на страницу логина. Т.е. сессия не подхватывается.

Если проделать аналогичные манипуляции, но логиниться через BasicAuth, то сессия подхватывается корректно. Что я еще нужно предусмотреть для корректного поднятия сессии?

Добрый день!

Большое спасибо за консультации, фиксану результат, на котором остановились. Может еще кому пригодится:
-> HandlerInterceptorAdapter(); (или иная точка входа для считывания заголовка пакетов)
–> VaadinSession.getAllSessions(); (действующие пользовательские сессии, для перебора)
—> vaadinSession.getSession().getId(); (получение идентификатора сессионной куки)
----> AppContext.setSecurityContext(); (собственно механизм управления контекстом операторов)

Вопрос можно наверно закрыть как решенный.

1 симпатия