0 Tage Serie
java / intermediate
Snippet

Benutzerdefinierte Autorisierung auf Methodenebene mittels SpEL-Bean-Auswertung

Die @PreAuthorize-Annotation von Spring Security unterstützt die Spring Expression Language (SpEL) mit Referenzen auf Beans via '@beanName'. Dadurch wird komplexe, dynamische Autorisierungslogik in eigene Komponenten ausgelagert, statt Controller oder Service-Methoden zu überladen.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Service
public class DocumentService {
@PreAuthorize("@documentSecurity.canAccess(#documentId, authentication)")
public Document getDocument(Long documentId) {
return findDocumentById(documentId);
}
}
@Component("documentSecurity")
public class DocumentSecurityChecker {
private final DocumentRepository repository;
public DocumentSecurityChecker(DocumentRepository repository) {
this.repository = repository;
}
public boolean canAccess(Long documentId, Authentication auth) {
if (auth == null || !auth.isAuthenticated()) {
return false;
}
return repository.isOwnerOrShared(documentId, auth.getName());
}
}
spring
Erklärung
1
@PreAuthorize("@documentSecurity.canAccess(#documentId, authentication)")
Ruft vor der Methodenausführung die Methode 'canAccess' der Spring-Bean 'documentSecurity' mit den Methodenargumenten und dem Sicherheitskontext auf.
2
public boolean canAccess(Long documentId, Authentication auth)
Wertet Zugriffsregeln programmatisch anhand von Repository-Prüfungen und Daten des aktuellen Benutzers aus.
3
return repository.isOwnerOrShared(documentId, auth.getName());
Prüft, ob der authentifizierte Benutzer Eigentümer des Dokuments ist oder Freigaberechte besitzt.