Controle de acesso ao repositório no Spring Data Rest baseado no princípio do usuário
Estou tentando implementar o controle de acesso de granulação fina enquanto ainda aproveito o restante dos dados do Spring.
Estou trabalhando para garantir umaCrudRepository
para que os usuários possam modificar ou inserir apenas dados que pertencem a eles. Estou fazendo uso de@PreAuthorize
/@PostAuthorize
e@PreFilter
/@PostFilter
para bloquear o acesso ao principal atual.
Até agora, meu repositório se parece com isso.
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();
}
Embora isso seja um pouco tedioso, parece conseguir o que eu estou procurando. (Se alguém souber uma maneira melhor, não hesite em me avisar!)
Onde eu estou tendo problemas é comdelete()
, count()
eexists()
@Override
long count();
@Override
void delete(Integer integer);
@Override
void delete(MyObject entity);
@Override
void deleteAll();
@Override
boolean exists(Integer integer);
Esses métodos levam umInteger
Parâmetro de identificação ou nenhum. Parece que eu teria que primeiro selecionar a entidade com o ID de entrada e depois executar a verificação de autenticação.
Este tipo de autorização é possível dentro do repositório?
obrigado
Editar:
Graças ao ksokol, isso parece estar funcionando agora.
Eu adicionei um novo bean a um@Configuration
classe
@Bean
public EvaluationContextExtension securityExtension() {
return new SecurityEvaluationContextExtensionImpl();
}
Este feijão se estendeEvaluationContextExtensionSupport
e substituigetRootObject
para retornar umSecurityExpressionRoot
que detém meu diretor 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){};
}
}