Heim > Java > javaLernprogramm > Hauptteil

Methodensicherheit mit @Secured Annotation im Frühjahr

王林
Freigeben: 2024-07-19 02:37:10
Original
577 Leute haben es durchsucht

Method security with @Secured Annotation in Spring

Diese Anmerkung bietet eine Möglichkeit, Sicherheitskonfiguration zu Geschäftsmethoden hinzuzufügen.

Es werden Rollen verwendet, um zu prüfen, ob ein Benutzer die Berechtigung zum Aufrufen dieser Methode hat. Die Anmerkung ist Teil der Federsicherheit. Um die Verwendung zu ermöglichen, benötigen Sie die Spring-Sicherheitsabhängigkeit.

Beispielszenario

Sie haben eine Anwendung, die über ein Produkt-CRUD verfügt. In diesem CRUD möchten Sie die Vorgänge mithilfe von zwei spezifischen Rollen steuern.

  • Benutzer: kann das Produkt erstellen und sehen. Ein Produkt kann jedoch nicht aktualisiert oder gelöscht werden.
  • Administrator:, der alle Benutzervorgänge ausführen und auch ein Produkt aktualisieren und löschen kann.

Sie können @Secured verwenden, um den Zugriff dieser Rollen bei jedem Vorgang zu verwalten.

Rollen für den Betrieb

In unserem Beispielszenario können wir die folgenden Rollen definieren.

  • ROLE_USER, ROLE_ADMIN

Zum Lesen:

  • ROLE_USER, ROLE_ADMIN

Zur Aktualisierung:

  • ROLE_ADMIN

Zum Löschen:

  • ROLE_ADMIN

Sehen wir uns ein Codebeispiel an und beobachten das Anwendungsverhalten.

Hinzufügen einer Spring-Sicherheitsabhängigkeit

Um mit der @Secured-Annotation zu arbeiten, fügen Sie die Maven-Abhängigkeit für Spring Security hinzu:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
Nach dem Login kopieren

Kommentieren von Methoden mit @Secured

Wir kommentieren die Methoden mit @Secured und definieren, welche Rollen auf das Methodenverhalten zugreifen können.

public class Product {

    private Long id;
    private String name;
    private BigDecimal value;

    //getters and setters
}

@Service
public class ProductService {

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public Product createProduct(Product product) {
        // Logic for creating a product
        return product;
    }

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public Product getProductById(Long id) {
        // Logic for fetching a product
        return null;
    }

    @Secured("ROLE_ADMIN")
    public Product updateProduct(Product product) {
        // Logic for updating a product
        return product;
    }

    @Secured("ROLE_ADMIN")
    public void deleteProduct(Long id) {
        // Logic for deleting a product
    }
}
Nach dem Login kopieren

Anwendungskonfiguration

Sie müssen @EnableGlobalMethodSecurity(securedEnabled = true) hinzufügen, um Ihre Spring-Anwendung für die Verwendung der Aktivierungsmethodensicherheit mithilfe von @Secured zu konfigurieren.

@SpringBootApplication
@EnableTransactionManagement
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MasteryApplication {

    public static void main(String[] args) {
        SpringApplication.run(MasteryApplication.class, args);
    }

}
Nach dem Login kopieren

Testen des Verhaltens

In unserem Beispiel werden wir das Verhalten mithilfe von Tests testen, also fügen wir die Spring-Boot-Testabhängigkeit hinzu.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

Nach dem Login kopieren

Dann erstellen wir Tests, um zu überprüfen, ob wir einen Scheinbenutzer verwenden und ihm bestimmte Rollen zuweisen. Wir können Benutzer in jeder Rolle und das Verhalten unserer Anwendung testen. Dadurch können wir sicherstellen, dass nur die richtigen Rollen die erlaubten Aktionen ausführen können.

@SpringBootTest
class ProductServiceTests {

    @Autowired
    private ProductService productService;

    @Test
    @WithMockUser(roles = "USER")
    void testCreateProductAsUser() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.createProduct(product));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testCreateProductAsAdmin() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.createProduct(product));
    }

    @Test
    @WithAnonymousUser
    void testCreateProductAsAnonymous() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.createProduct(product));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testGetProductByIdAsUser() {
        assertDoesNotThrow(() -> productService.getProductById(1L)); // Assuming product with ID 1 exists
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testGetProductByIdAsAdmin() {
        assertDoesNotThrow(() -> productService.getProductById(1L));
    }

    @Test
    @WithAnonymousUser
    void testGetProductByIdAsAnonymous() {
        assertThrows(AccessDeniedException.class, () -> productService.getProductById(1L));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testUpdateProductAsUser() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testUpdateProductAsAdmin() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.updateProduct(product));
    }

    @Test
    @WithAnonymousUser
    void testUpdateProductAsAnonymous() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testDeleteProductAsUser() {
        assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testDeleteProductAsAdmin() {
        assertDoesNotThrow(() -> productService.deleteProduct(1L));
    }

    @Test
    @WithAnonymousUser
    void testDeleteProductAsAnonymous() {
        assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L));
    }
}
Nach dem Login kopieren

Das war’s, jetzt können Sie den Benutzerzugriff auf die Anwendung mithilfe von Rollen mit der @Secured-Annotation verwalten.

Wenn Ihnen dieses Thema gefällt, folgen Sie mir unbedingt. In den folgenden Tagen werde ich mehr über Frühlingsanmerkungen erklären! Bleiben Sie dran!

Folge mir!

Das obige ist der detaillierte Inhalt vonMethodensicherheit mit @Secured Annotation im Frühjahr. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!