2014-05-13 11 views
8

Wenn ich ein Repository-Setup wie das folgende habe, mit Spring Data REST, kann ich auf die Daten zugreifen/Zugänge und sehen Sie alle Daten. Ich möchte jedoch nur Daten für den Benutzer zurückgeben. Ich habe einen benutzerdefinierten Finder "findByStorer", der dies tun würde. Wie würde ich Spring Data REST dazu bringen, dies zu verwenden und den Wert storer vom Benutzer zu erhalten, anstatt einen Abfrageparameter anzugeben?Spring Data REST-Filterung Daten auf der Grundlage des Benutzers

Ich habe noch keine Sicherheit implementiert, also ist diese Frage im Moment mehr Theorie als Übung.

Danke.

Antwort

2

Wenn Sie Spring Security verwenden, können Sie diesen Ansatz verwenden:

@PreAuthorize("isFullyAuthenticated() && (#userName == principal.username)") 
public List<User> findByUserName(@Param("userName")String userName); 
+0

dies nicht ganz erklären, wie aus dem Benutzernamen an die storer gehen, wenn zum Beispiel der Empfang Tabelle Benutzertabelle verbinden Sie müssen durch die Storer-Tabelle gehen. IE, etwas wie 'Select * von Benutzer, Empfang wo user.storer = receptor.storer'. – JBCP

3

Aufbauend auf @ RPR Antwort:

Sie sollten in der Lage sein, Eigenschaften des verbundenen Unternehmens zu verweisen (Storer). In Ihrem Beispiel, wenn Sie Empfang -> Speicher -> Benutzer haben, können Sie die Quittungen abfragen, bei denen Storer.user einen vom Sicherheitskontext injizierten Wert hat.

@PreAuthorize("isFullyAuthenticated && (#userName==principal.username)") 
Page<Receipt> findByStorer_User(@Param("userName") String userName) 
+3

Wie können wir diese findByStorer_User() -Methode als Standard festlegen, die findAll() ersetzt, wenn ein Benutzer mit eingeschränktem Zugriff die API verwendet? Wir möchten die findAll() für Admin-Benutzer behalten und haben eine eingeschränkte Methode für eingeschränkte Benutzer. – Wouter

1

Zum Beispiel gegeben, ein Repository für SomeEntity Sie durch Attribut owner mit Wert von` # {principal.username}

@RepositoryRestResource(path = "some-entities", collectionResourceRel = "some-entities", itemResourceRel = "some-entity") 
interface SomeEntityRepository extends PagingAndSortingRepository<SomeEntity, String> { 
    @Override 
    @RestResource(exported = true) 
    @Query("select someEntity from SomeEntity someEntity where someEntity.owner = ?#{principal.username}") 
    Iterable<SomeResource> findAll(); 
} 
0

Dieses Problem ist ein typisches findAll Methode mit einer benutzerdefinierten @Query Filterung außer Kraft setzen könnte Querschnittsaufgabe, so habe ich versucht, AOP anzuwenden. Definieren Beratung und aktualisieren Sie die args (String storer), wie erklären Sie bei: https://stackoverflow.com/a/46353783/1203628

@Aspect 
@Transactional 
@Component 
public class FilterProjectsAspect { 

@Pointcut("execution(* com.xxx.ReceiptRepository.findByStorer(..))") 
    public void projectFindAll() { 
    } 

    @Around("projectFindAll()") 
    public Object filterProjectsByUser(final ProceedingJoinPoint pjp) throws Throwable { 

     Object[] args = pjp.getArgs(); 
     for (int i = 0; i < args.length; i++) { 
      if (args[i] instanceof String) { 
       String storer=(String) args[i]; 
       // Find storer by user 
       args[i]=storer; //Update args 
      } 
     return pjp.proceed(args); 
    } 

} 
Verwandte Themen