Управление доступом к репозиторию в Spring Data Rest на основе пользовательского принципа
Я пытаюсь реализовать точный контроль доступа к зерну, все еще пользуясь преимуществом данных Spring.
Я работаю над обеспечениемCrudRepository
поэтому пользователи могут только изменять или вставлять данные, которые им принадлежат. Я использую@PreAuthorize
/@PostAuthorize
а также@PreFilter
/@PostFilter
заблокировать доступ к текущему принципалу.
Пока что мой репозиторий выглядит так.
public interface MyRepository extends CrudRepository<MyObject, Integer> {
@PreAuthorize("#entity.userId == principal.id")
@Override
<S extends MyObject> S save(S entity);
@PreFilter("filterObject.userId === principal.id")
@Override
<S extends MyObject> Iterable<S> save(Iterable<S> entities);
@PostAuthorize("returnObject.userId == principal.id")
@Override
MyObject findOne(Integer integer);
@PostFilter("filterObject.userId == principal.id")
@Override
Iterable<MyObject> findAll();
}
Хотя это немного утомительно, похоже, что я достигаю того, что мне нужно. (Если кто-нибудь знает лучший способ, не стесняйтесь, дайте мне знать!)
Где я сталкиваюсь с проблемамиdelete()
, count()
а такжеexists()
@Override
long count();
@Override
void delete(Integer integer);
@Override
void delete(MyObject entity);
@Override
void deleteAll();
@Override
boolean exists(Integer integer);
Эти методы либо принимаютInteger
Параметр ID или нет вообще. Кажется, мне нужно было бы сначала выбрать объект с идентификатором ввода, а затем выполнить проверку подлинности.
Возможен ли такой тип авторизации в хранилище?
Спасибо
Редактировать:
Благодаря ksokol это, кажется, работает сейчас.
Я добавил новый боб@Configuration
учебный класс
@Bean
public EvaluationContextExtension securityExtension() {
return new SecurityEvaluationContextExtensionImpl();
}
Этот боб расширяетсяEvaluationContextExtensionSupport
и переопределяетgetRootObject
вернутьSecurityExpressionRoot
это держит мой заказной принципал.
public class SecurityEvaluationContextExtensionImpl extends EvaluationContextExtensionSupport {
@Override
public String getExtensionId() {
return "security";
}
@Override
public Object getRootObject() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return new SecurityExpressionRoot(authentication){};
}
}