Σε αυτό το άρθρο, θα εξετάσουμε το Ασφάλεια μεθόδου ελατηρίου. Το επίπεδο μεθόδου Spring Security μας επιτρέπει να προσθέτουμε ασφάλεια σε μεμονωμένες μεθόδους εντός του επιπέδου υπηρεσιών μας.
Ασφάλεια μεθόδου ελατηρίου
Με απλά λόγια, η ασφάλεια της μεθόδου Spring μας επιτρέπει να υποστηρίζουμε / προσθέτουμε υποστήριξη εξουσιοδότησης σε επίπεδο μεθόδου. Σε υψηλό επίπεδο, μπορούμε να διαμορφώσουμε ποιοι ρόλοι επιτρέπεται να έχουν πρόσβαση σε ποια μέθοδο εντός της ίδιας κλάσης υπηρεσίας. Ας πάρουμε ένα παράδειγμα CustomerService
τάξη.
- Μια υπηρεσία εξυπηρέτησης πελατών μπορεί να χρησιμοποιήσει μόνο τη μέθοδο προβολής.
- Επιτρέπουμε μόνο στον χρήστη με
Admin
άδεια να καλέσετε τοdelete
μέθοδος στην ίδια κατηγορία υπηρεσιών.
Σε αυτό το άρθρο, θα εξετάσουμε τα βήματα και τις ρυθμίσεις παραμέτρων για την ενεργοποίηση της ασφάλειας επιπέδου μεθόδου ελατηρίου χρησιμοποιώντας τους διαφορετικούς σχολιασμούς. Η ασφάλεια Spring υποστηρίζει τόσο σχολιασμό με βάση το JSR-250 όσο και σχολιασμό με βάση την ασφάλεια Spring, που μας επιτρέπει να χρησιμοποιούμε τη νέα και ισχυρή γλώσσα έκφρασης Spring.
1. Maven Dependencies
Για να ξεκινήσουμε, πρέπει να διασφαλίσουμε ότι η ασφάλεια ελατηρίου θα προστεθεί ως απαιτούμενη εξάρτηση στην εφαρμογή μας. Για εφαρμογή που βασίζεται σε Spring Boot, πρέπει να προσθέσουμε τον εκκινητή ασφαλείας ελατηρίου ως εξάρτηση από την εφαρμογή μας. pom.xml
θα μοιάζει με:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
Αυτό το άρθρο είναι μέρος των οδηγών μας για την ασφάλεια της άνοιξης. Μπορείτε να κατεβάσετε τον πλήρη πηγαίο κώδικα από το δικό μας Αποθετήριο GitHub.
2. EnableGlobalMethodSecurity
Για να ενεργοποιήσουμε την ασφάλεια βάσει σχολιασμού, πρέπει να προσθέσουμε το @EnableGlobalMethodSecurity
σχολιασμός σε οποιοδήποτε @Configuration
class.Έτσι θα μοιάζει η τάξη διαμόρφωσής μας:
package com.javadevjournal.config;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
/**
* EnableGlobalMethodSecurity to allow method level Spring security annotation for our application
*/
@EnableGlobalMethodSecurity(
securedEnabled = true,
jsr250Enabled = true,
prePostEnabled = true
)
public class MethodSecurityConfig {
//default configuration class
}
Ας δούμε μερικές σημαντικές παραμέτρους του @EnableGlobalMethodSecurity
σχόλιο
securedEnabled
– Προσδιορίστε εάν το@Security
ο σχολιασμός πρέπει να είναι ενεργοποιημένος.jsr250Enabled
– Επιτρέψτε μας να χρησιμοποιήσουμε σχολιασμό που βασίζεται στο JSR250 (π.χ@RoleAllowed
).prePostEnabled
– Ενεργοποιήστε τους σχολιασμούς προ/ανάρτησης του Spring.
3. Χρήση της μεθόδου Spring Security
Έχουμε διαμορφώσει και ενεργοποιήσει το Ασφάλεια μεθόδου ελατηρίου διαμόρφωση. Ας δούμε πώς να τα χρησιμοποιήσετε στον κώδικά σας. Θα ξεκινήσουμε με το πρωτότυπο του πλαισίου @Secured
σχόλιο.
3.1. Χρήση @Secured Annotation
ο @Secured
Ο σχολιασμός χρησιμοποιείται για τον καθορισμό της λίστας ρόλων σε μια μέθοδο. Αυτό μας επιτρέπει να παρέχουμε πρόσβαση σε μια συγκεκριμένη μέθοδο σε περίπτωση που ο χρήστης έχει κάποιο ρόλο. Ας πάρουμε το παράδειγμα ενός REST API, όπου θέλουμε να δώσουμε πρόσβαση σε ένα τελικό σημείο μόνο σε περίπτωση που ο πελάτης έχει έναν συγκεκριμένο ρόλο. Μπορούμε να το κάνουμε εύκολα χρησιμοποιώντας το @Secured
σχόλιο. Ας δούμε το παρακάτω παράδειγμα:
@RestController
@RequestMapping("/api/v2/users")
public class UserRestAPI {
@GetMapping("/hello")
public String getData(){
return "hello";
}
@Secured("ROLE_CUSTOMER")
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id){
return "id";
}
}
Εδώ, η πρώτη μέθοδος είναι προσβάσιμη σε όλους τους χρήστες, αλλά η δεύτερη μέθοδος είναι προσβάσιμη μόνο σε περίπτωση που ο πελάτης έχει «ROLE_CUSTOMER
” ρόλος. Η Spring Security μεταβιβάζει αυτές τις πληροφορίες στο AccessDecisionManager για να λάβει την πραγματική απόφαση. Εάν το εκτελέσετε και προσπαθήσετε να αποκτήσετε πρόσβαση στη δεύτερη μέθοδο ως anonymous
χρήστη, θα λάβετε ξανά το σφάλμα άρνησης πρόσβασης από το API. Μπορούμε επίσης να περάσουμε μια λίστα ρόλων στο @Secured
σχόλιο.
@Secured({"ROLE_CUSTOMER", "ROLE_USER"})
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id){
return "id";
}
Δεν μπορούμε να χρησιμοποιήσουμε Spring EL
στο @Secured
σχόλιο. Χρησιμοποιήστε το στοιχείο ελέγχου πρόσβασης βάσει έκφρασης για χρήση Spring EL
σχετικά με τον μηχανισμό εξουσιοδότησης.
3.2. Χρησιμοποιώντας τα @PreAuthorize και @PostAuthorize Annotations
Και τα δυο @PreAuthrize
και @PostAuthorize
Οι σχολιασμοί μας επιτρέπουν να χρησιμοποιήσουμε τη σύνταξη που βασίζεται στην έκφραση Spring για να ενεργοποιήσουμε την ασφάλεια της μεθόδου Spring. Για να χρησιμοποιήσουμε αυτούς τους σχολιασμούς, πρέπει να ορίσουμε το prePostEnabled = true
στο @EnableGlobalMethodSecurity
σχόλιο. Όπως υποδηλώνει το όνομα:
- ο
@PreAuthorize
έλεγχος σχολιασμού πριν από την εκτέλεση της μεθόδου. @PostAuthorize
ελέγξτε αν μπορεί να αλλάξει το αποτέλεσμα.
Ας δούμε πώς να αλλάξετε την παραπάνω δήλωση ασφαλείας για να χρησιμοποιήσετε τον νέο σχολιασμό
@RestController
@RequestMapping("/api/v2/users")
public class UserRestAPI {
@GetMapping("/hello")
public String getData() {
return "hello";
}
//@Secured({"ROLE_CUSTOMER", "ROLE_USER"}) this is ole configuration
@PreAuthorize("hasRole('ROLE_CUSTOMER') or hasRole('ROLE_USER')")
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id) {
return "id";
}
}
Όπως είπαμε, μπορείτε να χρησιμοποιήσετε την έκφραση Spring με αυτούς τους σχολιασμούς, οπότε αν θέλουμε μπορούμε να χρησιμοποιήσουμε τα ορίσματα της μεθόδου ως μέρος της έκφρασης ασφαλείας Spring.
@RestController
@RequestMapping("/api/v2/users")
public class UserRestAPI {
@GetMapping("/hello")
public String getData() {
return "hello";
}
//@Secured({"ROLE_CUSTOMER", "ROLE_USER"}) this is ole configuration
@PreAuthorize(@PreAuthorize("#username == authentication.principal.username"))
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id) {
return "id";
}
}
ο @PostAuthorize
δουλεύω με τον ίδιο τρόπο, εκτός από το ότι μπορεί να αλλάξει την έξοδο μετά το αποτέλεσμα.

3.3. Πολλαπλοί σχολιασμοί ασφαλείας ελατηρίου σε μια μέθοδο
Σε περίπτωση που δεν μπορείτε να επιτύχετε τα επιθυμητά αποτελέσματα με έναν μόνο σχολιασμό ασφαλείας, μπορείτε πάντα να συνδυάσετε πολλούς σχολιασμούς ασφαλείας Spring
@Secured({
"ROLE_CUSTOMER",
"ROLE_USER"
})
@PreAuthorize(@PreAuthorize("#username == authentication.principal.username"))
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id) {
return "id";
}
Λάβετε υπόψη ότι οι σχολιασμοί του Spring Security δεν μπορούν να επαναληφθούν, επομένως δεν μπορείτε να έχετε δύο περιπτώσεις @PreAuthorize
κ.λπ., αλλά μπορείτε να συνδυάσετε @PreAuthorize
, @Secured
και σχολιασμοί JSR-250.
4. Σχολιασμός επιπέδου κλάσης ασφάλειας Spring
Η ασφάλεια ελατηρίου παρέχει την επιλογή χρήσης αυτών των σχολιασμών σε επίπεδο τάξης. Αυτό είναι πραγματικά χρήσιμο εάν χρησιμοποιούμε τον ίδιο τύπο σχολιασμού για κάθε μέθοδο εντός της κλάσης. Εδώ, μπορούμε να προσθέσουμε τον σχολιασμό σε επίπεδο τάξης για να προστατεύσουμε ολόκληρη την τάξη με βάση τον ίδιο κανόνα και τη ροή εργασίας εξουσιοδότησης.
@Service("customerAccountService")
@PreAuthorize("hasRole('ROLE_CUSTOMER')")
public class DefaultCustomerAccountService implements CustomerAccountService {
}
Η ασφάλεια Spring χρησιμοποιεί εσωτερικά το AOP για ασφάλεια σε επίπεδο μεθόδου. Η ασφάλεια καθολικής μεθόδου χρησιμοποιείται για την εφαρμογή ελέγχων ασφαλείας σε ορισμένες μεθόδους. Κοίτα στο GlobalMethodSecurityBeanDefinitionParser
τάξη για περισσότερες πληροφορίες.
Περίληψη
Σε αυτό το άρθρο, εξετάζουμε το Ασφάλεια μεθόδου ελατηρίου. Είδαμε τη διαφορετική επιλογή εφαρμογής της ασφάλειας Spring σε επίπεδο μεθόδου. Καλύψαμε τα παρακάτω στοιχεία.
- Πώς να ενεργοποιήσετε την ασφάλεια της μεθόδου Spring.
- Πώς μπορούμε να χρησιμοποιήσουμε διαφορετικούς σχολιασμούς ασφαλείας Spring σε επίπεδο μεθόδου;
- Μάθαμε την επιλογή χρήσης του σχολιασμού ασφαλείας σε επίπεδο μεθόδου.