ZVVQ代理分享网

Spring 中使用 @Secured 注解的方法安全性(spring注解

作者:zvvq博客网
导读该注解提供了一种为业务方法添加安全配置的方法。 它将使用角色来检查用户是否有权限调用该方法。注解是 spring security 的一部分。因此,要启用它的使用,您需要 spring security 依赖

该注解提供了一种为业务方法添加安全配置的方法。

它将使用角色来检查用户是否有权限调用该方法。注解是 spring security 的一部分。因此,要启用它的使用,您需要 spring security 依赖项。

示例场景您有一个具有产品 crud 的应用程序。在此 crud 中,您希望使用两个特定角色来控制操作。

用户:可以创建产品并查看产品。但无法更新或删除产品。 管理员:可以进行所有用户操作,还可以更新和删除产品。您可以使用@secured 来管理这些角色对每个操作的访问权限。

运营角色我们可以在示例场景中定义以下角色。

role_user、role_admin阅读:

role_user、role_admin更新:

role_admin删除:

role_admin让我们看一个代码示例并观察应用程序的行为。

添加 spring security 依赖要使用@secured 注解,请为 spring security 添加 maven 依赖项:

org.springframework.bootspring-boot-starter-security

使用@secured注释方法我们用@secured 注释方法,定义哪些角色可以访问方法行为。

publicclassproduct{

privatelongid;

privatestringname;

privatebigdecimalvalue;

//gettersandsetters

}

@service

publicclassproductservice{

@secured({"role_user","role_admin"})

publicproductcreateproduct(productproduct){

//logicforcreatingaproduct

returnproduct;

}

@secured({"role_user","role_admin"})

publicproductgetproductbyid(longid){

//logicforfetchingaproduct

returnnull;

}

@secured("role_admin")

publicproductupdateproduct(productproduct){

//logicforupdatingaproduct

returnproduct;

}

@secured("role_admin")

publicvoiddeleteproduct(longid){

//logicfordeletingaproduct

}

}

应用配置您需要添加@enableglobalmethodsecurity(securedenabled = true)来配置您的spring应用程序以使用@secured启用方法安全性。

@springbootapplication

@enabletransactionmanagement

@enableglobalmethodsecurity(securedenabled = true)

publicclassmasteryapplication{

publicstaticvoidmain(string[]args){

springapplication.run(masteryapplication.class,args);

}

}

测试行为在我们的示例中,我们将使用测试来测试行为,因此我们添加 spring boot 测试依赖项。

org.springframework.securityspring-security-testtest

然后我们创建测试来验证是否使用模拟用户并为其分配特定角色,我们可以测试每个角色中的用户以及我们的应用程序的行为方式。通过这样做,我们可以确保只有正确的角色才能执行允许的操作。

@SpringBootTest

classProductServiceTests{

@Autowired

privateProductServiceproductService;

@Test

@WithMockUser(roles="USER")

voidtestCreateProductAsUser(){

Productproduct=newProduct();

assertDoesNotThrow(()->productService.createProduct(product));

}

@Test

@WithMockUser(roles="ADMIN")

voidtestCreateProductAsAdmin(){

Productproduct=newProduct();

assertDoesNotThrow(()->productService.createProduct(product));

}

@Test

@WithAnonymousUser

voidtestCreateProductAsAnonymous(){

Productproduct=newProduct();

assertThrows(AccessDeniedException.class,()->productService.createProduct(product));

}

@Test

@WithMockUser(roles="USER")

voidtestGetProductByIdAsUser(){

assertDoesNotThrow(()->productService.getProductById(1L));//AssumingproductwithID1exists

}

@Test

@WithMockUser(roles="ADMIN")

voidtestGetProductByIdAsAdmin(){

assertDoesNotThrow(()->productService.getProductById(1L));

}

@Test

@WithAnonymousUser

voidtestGetProductByIdAsAnonymous(){

assertThrows(AccessDeniedException.class,()->productService.getProductById(1L));

}

@Test

@WithMockUser(roles="USER")

voidtestUpdateProductAsUser(){

Productproduct=newProduct();

assertThrows(AccessDeniedException.class,()->productService.updateProduct(product));

}

@Test

@WithMockUser(roles="ADMIN")

voidtestUpdateProductAsAdmin(){

Productproduct=newProduct();

assertDoesNotThrow(()->productService.updateProduct(product));

}

@Test

@WithAnonymousUser

voidtestUpdateProductAsAnonymous(){

Productproduct=newProduct();

assertThrows(AccessDeniedException.class,()->productService.updateProduct(product));

}

@Test

@WithMockUser(roles="USER")

voidtestDeleteProductAsUser(){

assertThrows(AccessDeniedException.class,()->productService.deleteProduct(1L));

}

@Test

@WithMockUser(roles="ADMIN")

voidtestDeleteProductAsAdmin(){

assertDoesNotThrow(()->productService.deleteProduct(1L));

}

@Test

@WithAnonymousUser

voidtestDeleteProductAsAnonymous(){

assertThrows(AccessDeniedException.class,()->productService.deleteProduct(1L));

}

}

就是这样,现在您可以使用带有@secured 注释的角色来管理用户对应用程序的访问。