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
@Servicepublic 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.