Control de acceso al repositorio en Spring Data Rest basado en el usuario princpal
Estoy intentando implementar el control de acceso de grano fino mientras sigo aprovechando el descanso de datos de Spring.
Estoy trabajando para asegurar unCrudRepository
para que los usuarios solo puedan modificar o insertar datos que les pertenezcan. Estoy haciendo uso de@PreAuthorize
/@PostAuthorize
y@PreFilter
/@PostFilter
para bloquear el acceso al principal actual.
Hasta ahora mi repositorio se ve así.
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();
}
Si bien esto es un poco tedioso, parece lograr lo que busco. (Si alguien conoce una mejor manera, ¡no dudes en hacérmelo saber!)
Donde me encuentro con problemas es condelete()
, count()
yexists()
@Override
long count();
@Override
void delete(Integer integer);
@Override
void delete(MyObject entity);
@Override
void deleteAll();
@Override
boolean exists(Integer integer);
Estos métodos toman unInteger
Parámetro ID o ninguno en absoluto. Parece que primero tendría que seleccionar la entidad con la ID de entrada y luego realizar la verificación de autenticación.
¿Es posible este tipo de autorización dentro del repositorio?
Gracias
Editar:
Gracias a ksokol esto parece estar funcionando ahora.
Agregué un nuevo bean a un@Configuration
clase
@Bean
public EvaluationContextExtension securityExtension() {
return new SecurityEvaluationContextExtensionImpl();
}
Este frijol se extiendeEvaluationContextExtensionSupport
y anulagetRootObject
devolver unSecurityExpressionRoot
eso tiene mi principal personalizado.
public class SecurityEvaluationContextExtensionImpl extends EvaluationContextExtensionSupport {
@Override
public String getExtensionId() {
return "security";
}
@Override
public Object getRootObject() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return new SecurityExpressionRoot(authentication){};
}
}