Rumah > Java > javaTutorial > teks badan

Kaedah keselamatan dengan Anotasi @Secured pada Musim Bunga

王林
Lepaskan: 2024-07-19 02:37:10
asal
721 orang telah melayarinya

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>
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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

}
Salin selepas log masuk

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>

Salin selepas log masuk

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));
    }
}
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!