Μέθοδος ελατηρίου Ασφάλεια | Java Development Journal

0
Μέθοδος ελατηρίου Ασφάλεια |  Java Development Journal

Σε αυτό το άρθρο, θα εξετάσουμε το Ασφάλεια μεθόδου ελατηρίου. Το επίπεδο μεθόδου 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 σχόλιο. Όπως υποδηλώνει το όνομα:

  1. ο @PreAuthorize έλεγχος σχολιασμού πριν από την εκτέλεση της μεθόδου.
  2. @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 σε επίπεδο μεθόδου. Καλύψαμε τα παρακάτω στοιχεία.

  1. Πώς να ενεργοποιήσετε την ασφάλεια της μεθόδου Spring.
  2. Πώς μπορούμε να χρησιμοποιήσουμε διαφορετικούς σχολιασμούς ασφαλείας Spring σε επίπεδο μεθόδου;
  3. Μάθαμε την επιλογή χρήσης του σχολιασμού ασφαλείας σε επίπεδο μεθόδου.

Schreibe einen Kommentar