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.
Anda mempunyai aplikasi yang mempunyai CRUD produk. Dalam CRUD ini anda ingin mengawal operasi menggunakan dua peranan khusus.
Anda boleh menggunakan @Secured untuk mengurus akses peranan tersebut pada setiap operasi.
Kami boleh menentukan peranan berikut dalam senario contoh kami.
Untuk membaca:
Untuk mengemas kini:
Untuk memadam:
Mari kita lihat contoh kod dan perhatikan gelagat aplikasi.
Untuk bekerja dengan anotasi @Secured, tambahkan kebergantungan Maven untuk Spring Security:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
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 } }
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); } }
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!