Σε αυτό το άρθρο, θα εξετάσουμε την προσθήκη α προσαρμοσμένο φίλτρο στο Spring Security. Θα δούμε τις διάφορες περιπτώσεις χρήσης για την προσθήκη ενός προσαρμοσμένου φίλτρου στο Spring Security μαζί με ποιες είναι οι διαφορετικές επιλογές για να προσθέσετε ένα φίλτρο με το Spring Security.
1. Προσαρμοσμένο φίλτρο στο Spring Security
Όπως γνωρίζουμε ότι η ασφάλεια Spring λειτουργεί στις βασικές έννοιες της αλυσίδας φίλτρων, η οποία δεν είναι παρά ένα σύνολο φίλτρων που προστίθενται στο αίτημα για την εκτέλεση της εργασίας ασφάλειας για την εφαρμογή μας. Το Spring Security παρέχει πολλά φίλτρα από προεπιλογή και τις περισσότερες φορές αυτά είναι αρκετά. Υπάρχουν λίγες περιπτώσεις χρήσης όπου μπορεί να χρειαστεί να δημιουργήσουμε ένα προσαρμοσμένο φίλτρο ασφαλείας ελατηρίου για τις απαιτήσεις μας.
Τα φίλτρα στην αρχιτεκτονική Spring Security είναι τυπικά φίλτρα HTTP. Μπορούμε να δημιουργήσουμε φίλτρα εφαρμόζοντας το Φίλτρο διεπαφή από το javax.servlet
πακέτο. Όπως για οποιοδήποτε άλλο φίλτρο HTTP, παρακάμψτε το doFilter()
μέθοδος εφαρμογής της λογικής του. Για να λάβουμε την υποστήριξη ασφαλείας Spring, μπορούμε να χρησιμοποιήσουμε το GenericFilterBean
αφηρημένη τάξη. Αυτή η κλάση υλοποιεί τη διεπαφή φίλτρου Java και παρέχει μια υλοποίηση για τη μέθοδο προετοιμασίας φίλτρου (init()
). Η ασφάλεια ελατηρίου παρέχει τις ακόλουθες επιλογές κατά την προσθήκη α προσαρμοσμένο φίλτρο σε αλυσίδα φίλτρου ασφαλείας.
- Προσθήκη φίλτρου πριν από ένα υπάρχον στην αλυσίδα.
- Προσθήκη φίλτρου μετά από ένα υπάρχον στην αλυσίδα.
- Προσθήκη/Αντικατάσταση φίλτρου στη θέση κάποιου άλλου στην αλυσίδα
2. Εγγραφή προσαρμοσμένου φίλτρου ασφαλείας ελατηρίου
Ας πάρουμε ένα απλό παράδειγμα όπου θέλουμε να επικυρώσουμε μια συγκεκριμένη κεφαλίδα πριν επιτρέψουμε την εκτέλεση της άλλης αλυσίδας φίλτρου, σε περίπτωση που λείπει η κεφαλίδα, θα στείλουμε μη εξουσιοδοτημένη απάντηση στον πελάτη, για έγκυρη κεφαλίδα, θα συνεχίσουμε τη διαδρομή φίλτρου και αφήστε την ασφάλεια ελατηρίου να εκτελέσει την κανονική ροή εργασίας. Ας δούμε πώς φαίνεται το προσαρμοσμένο φίλτρο μας:
package com.javadevjournal.core.security.filter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomHeaderAuthFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
var request = (HttpServletRequest) servletRequest;
var response = (HttpServletResponse) servletResponse;
//if header is missing , send un-athorized error back
String authHeader = request.getHeader("X-HEADER");
if (StringUtils.isEmpty(authHeader)) {
response.setStatus(
HttpServletResponse.SC_UNAUTHORIZED);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
Αυτός είναι ένας απλός κώδικας που δείχνει πώς να δημιουργήσετε ένα αρχείο αρχείου, μπορείτε να βάλετε τη λογική σύμφωνα με τις απαιτήσεις σας. Το επόμενο μέρος είναι να το καταχωρήσετε προσαρμοσμένο φίλτρο στο Spring Security αλυσίδα φίλτρου.
3. Διαμόρφωση προσαρμοσμένου φίλτρου με ασφάλεια ελατηρίου
Ας διαμορφώσουμε το προσαρμοσμένο μας φίλτρο με αλυσίδα φίλτρων ασφαλείας Spring. Η ασφάλεια ελατηρίου παρέχει λίγες επιλογές για την εγγραφή του προσαρμοσμένου φίλτρου. Μπορούμε να χρησιμοποιήσουμε ένα από αυτά με βάση τις απαιτήσεις μας.
- addFilterAfter (φίλτρο, τάξη)–Προσθέτει ένα φίλτρο μετά τη θέση της καθορισμένης κατηγορίας φίλτρου.
- addFilterBefore (φίλτρο, τάξη)–Φίλτρο πριν από τη θέση της καθορισμένης κατηγορίας φίλτρου.
- addFilterAt (φίλτρο, τάξη)–Προσθέτει ένα φίλτρο στη θέση της καθορισμένης κατηγορίας φίλτρου.
- addFilter(φίλτρο)–προσθέτει ένα φίλτρο που πρέπει να είναι μια παρουσία ή να επεκτείνει το φίλτρο που παρέχεται από το Spring Security
Σε περίπτωση που παρακάμπτετε το προεπιλεγμένο φίλτρο του Spring Security (π.χ UsernamePasswordAuthenticationFilter
), θα πρέπει είτε την τάξη είτε την αφηρημένη τάξη.
@Configuration
public class AppSecurityConfigurerAdapter
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterAfter(
customAuthFilter(), BasicAuthenticationFilter.class);
}
}
@Bean
public CustomHeaderAuthFilter customAuthFilter(){
return new CustomHeaderAuthFilter();
}
Εδώ, προσθέτουμε το προσαρμοσμένο μας φίλτρο μετά το BasicAuthenticationFilter
. Μπορείτε να προσθέσετε το φίλτρο σύμφωνα με τις απαιτήσεις σας. Εδώ είναι ένα άλλο παράδειγμα όπου προσθέτουμε φίλτρο μετά το UsernamePasswordAuthenticationFilter
.
http.addFilterBefore(authFilter(), UsernamePasswordAuthenticationFilter.class);
4. Δοκιμή προσαρμοσμένου φίλτρου
Με όλες τις παραπάνω ρυθμίσεις, είμαστε όλοι έτοιμοι για την εφαρμογή μας. Μόλις εκτελέσουμε την εφαρμογή μας και προσπαθήσουμε να συνδεθούμε χωρίς να περάσουμε την κεφαλίδα ασφαλείας, θα λάβουμε το σφάλμα απαγόρευσης πρόσβασης.

Περίληψη
Σε αυτό το άρθρο, είδαμε την προσθήκη α προσαρμοσμένο φίλτρο στο Spring Security στην εφαρμογή ασφαλείας μας για την Άνοιξη. Είδαμε επίσης πώς να το προσθέσουμε πριν, μετά ή σε μια συγκεκριμένη θέση της στοίβας φίλτρων ασφαλείας. Ο πηγαίος κώδικας για αυτό το άρθρο είναι διαθέσιμος στην ιστοσελίδα μας GitHub αποθήκη.