У меня есть случай, когда определенные конечные точки на контроллере должны возвращать 401, если имя пользователя, с которым аутентифицировался пользователь, совпадает с именем пользователя, с которым он работает.
Я думал о лучшем способе сделать это. В настоящее время у меня есть фасад аутентификации (https://www.baeldung.com/get-user-in-spring-security), где я проверяю в теле каждого метода контроллера, должен ли пользователь иметь доступ для работы с элементом, который он запрашивает.
IE. Пользователь должен иметь возможность удалить только свою учетную запись:
User u = service.findOne(id);
if (u != null) {
// user can only delete their own account
User authenticated = authenticationFacade.getAuthUser();
RestPreconditions.checkRequestState(authenticated.getId() == u.getId());
}
Другой случай, когда пользователю нужно работать с чем-то другого типа данных, с которыми у него есть доступ для работы.
IE
Post p = service.findOne(id);
if (p != null) {
// user can only delete their own posts
User authenticated = authenticationFacade.getAuthUser();
RestPreconditions.checkRequestState(authenticated.getId() == p.getUser().getId());
}
Я здесь, чтобы спросить, является ли это лучшим способом. Как показано выше, некоторые проверки требуют работы с различными объектами и выполнения вызовов базы данных, чтобы получить данные, чтобы определить, должен ли пользователь иметь доступ.
Я рассматривал реализацию на основе ролей и задавался вопросом, может ли кто-нибудь дать некоторое представление о том, как я это сделаю, и будет ли он чище, чем описанный выше метод.
Причина, по которой я спрашиваю, заключается в том, что я также хочу, чтобы люди с ролью ROLE_ADMIN могли выполнять все операции, но мне нужно преобразовать текущие проверки в или || с текущими проверками, и это кажется грязным. Но просто предварительно авторизовать только роль администратора все равно не получится с фасадом без или