Rumah  >  Artikel  >  Java  >  Kaedah keselamatan dengan Anotasi @Secured pada Musim Bunga

Kaedah keselamatan dengan Anotasi @Secured pada Musim Bunga

王林
王林asal
2024-07-19 02:37:10694semak imbas

Method security with @Secured Annotation in Spring

Anotasi ini menyediakan cara untuk menambahkan konfigurasi keselamatan pada kaedah perniagaan.

Ia akan menggunakan peranan untuk menyemak sama ada pengguna mempunyai kebenaran untuk memanggil kaedah ini. Anotasi adalah sebahagian daripada keselamatan musim bunga. Jadi untuk mendayakan penggunaannya, anda memerlukan pergantungan keselamatan musim bunga.

Contoh Senario

Anda mempunyai aplikasi yang mempunyai CRUD produk. Dalam CRUD ini anda ingin mengawal operasi menggunakan dua peranan khusus.

  • Pengguna: boleh mencipta produk dan melihat produk. Tetapi tidak boleh mengemas kini atau memadamkan produk.
  • Pentadbir: yang boleh melakukan semua operasi pengguna dan juga boleh mengemas kini serta memadam produk.

Anda boleh menggunakan @Secured untuk mengurus akses peranan tersebut pada setiap operasi.

Peranan untuk Operasi

Kami boleh menentukan peranan berikut dalam senario contoh kami.

  • ROLE_USER, ROLE_ADMIN

Untuk membaca:

  • ROLE_USER, ROLE_ADMIN

Untuk mengemas kini:

  • PERANAN_ADMIN

Untuk memadam:

  • PERANAN_ADMIN

Mari kita lihat contoh kod dan perhatikan gelagat aplikasi.

Menambah Kebergantungan Keselamatan Musim Bunga

Untuk bekerja dengan anotasi @Secured, tambahkan kebergantungan Maven untuk Spring Security:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Kaedah Anotasi dengan @Secured

Kami menganotasi kaedah dengan @Secured menentukan peranan yang boleh mengakses kelakuan kaedah.

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
    }
}

Konfigurasi aplikasi

Anda perlu menambah @EnableGlobalMethodSecurity(securedEnabled = true) untuk mengkonfigurasi aplikasi Spring anda untuk menggunakan mendayakan keselamatan kaedah menggunakan @Secured.

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

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

}

Menguji Tingkah Laku

Dalam contoh kami, kami akan menguji tingkah laku menggunakan ujian, jadi kami menambah kebergantungan ujian but spring.

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

Kemudian kami membuat ujian untuk mengesahkan jika menggunakan pengguna olok-olok dan memberikan peranan khusus kepadanya, kami boleh menguji pengguna dalam setiap peranan dan cara aplikasi kami berkelakuan. Dengan berbuat demikian, kami dapat memastikan bahawa hanya peranan yang betul boleh melakukan tindakan yang dibenarkan.

@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));
    }
}

Itu sahaja, kini anda boleh mengurus akses pengguna kepada aplikasi menggunakan peranan dengan anotasi @Secured.

Jika anda suka topik ini, pastikan anda mengikuti saya. Pada hari-hari berikutnya, saya akan menerangkan lebih lanjut tentang anotasi Spring! Nantikan!

Ikuti saya!

Atas ialah kandungan terperinci Kaedah keselamatan dengan Anotasi @Secured pada Musim Bunga. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah DTO? kenapa guna?Artikel seterusnya:Apakah DTO? kenapa guna?