Witajcie,
Mam problem z implementacją uprawnień opartych na spring ACL w mojej aplikacji.
Mam 2 encje: User i UserLogin
@Entity
public class User {
@Id @GeneratedValue @Column(name = "user_id")
private Integer id;
@Column
private String name;
@OneToMany(mappedBy = "user")
private List<UserLogin> logins;
// Getters and setters
}
@Entity
public class UserLogin {
@Id @GeneratedValue
private Integer id;
@Column
private Date date;
@ManyToOne @JoinColumn(name = "user_id")
private User user;
// Getters and setters
}
W warstwie widoku, dla zalogowanego użytkownika, na jego własnym profilu chcę pokazywać podzieloną na strony listę jego logowań.
Metoda w interfejsie warstwy serwisowej, która pozwala pobrać mi potrzebną dla widoku listę logowań.
@PostFilter("hasPermission(filterObject, 'read')")
public List<UserLogin> getUserLogins(User user, Pageable pageable);
Użytkownik X ma dostęp do wszystkich logowań, które odbyły się na jego login.
Tutaj tez pojawia się mój problem, ponieważ w warstwie widoku potrzebuję wyświetlać lub nie link do strony z listą logowań w zależności czy użytkownik ma do nich uprawnienia (do listy logowań na jego login).
Jeżeli chcę otrzymać taki rezultat, muszę pobrać wszystkie logowania dla tego użytkownika (bez dzielenia ich na strony), następnie przefiltrować je za pomocą @PostFilter i w zależnosci od tego czy przefiltrowana lista jest pusta, lub nie
pokazać lub ukryć odpowiedni link.
Macie pomysł jak napisać to inaczej? Tak żeby nie pobierać wszystkich logowań i nie sprawdzać uprawnień do każdego logowania?
Myślałem żeby zdefiniować dodatkowe uprawnienie np. VIEW_LOGINS i dodawać je odpowiedniemu użytkownikowi, potem sprawdzać po prostu czy aktualnie zalogowany użytkownik ma to uprawnienie na użytkowniku, którego profil ogląda, lecz nie
jestem przekonany czy jest to dobry pomysł np. jeżeli chciałbym dodać możliwość usuwania poszczególnych logowań przez użytkownika. Wtedy musiałbym zdefiniować kolejną permisję REMOVE_LOGINS, czy jakoś kombinować z uprawnieniami na
obiekcie UserLogin?
Proszę was o pomoc, ponieważ nie jestem przekonany, które rozwiązanie jest lepsze i ilość źródeł w sieci na ten temat jest znikoma.