zvvq技术分享网

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

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

zvvq

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

内容来自zvvq,别采集哟

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

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

zvvq.cn

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

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

role_user、role_admin阅读:

内容来自zvvq

role_user、role_admin更新: 内容来自samhan666

role_admin删除: 内容来自samhan

role_admin让我们看一个代码示例并观察应用程序的行为。 内容来自zvvq,别采集哟

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

zvvq.cn

org.springframework.bootspring-boot-starter-security 内容来自samhan666

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

publicclassproduct{

内容来自samhan666

privatelongid;

内容来自zvvq,别采集哟

privatestringname;

内容来自samhan

privatebigdecimalvalue; 内容来自zvvq

//gettersandsetters 内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

@service

内容来自samhan666

publicclassproductservice{

zvvq

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

publicproductcreateproduct(productproduct){ zvvq好,好zvvq

//logicforcreatingaproduct

copyright zvvq

returnproduct;

内容来自samhan

}

内容来自samhan

@secured({"role_user","role_admin"}) 内容来自samhan666

publicproductgetproductbyid(longid){

内容来自samhan666

//logicforfetchingaproduct

内容来自samhan666

returnnull; zvvq好,好zvvq

}

内容来自samhan

@secured("role_admin") 内容来自zvvq

publicproductupdateproduct(productproduct){ zvvq好,好zvvq

//logicforupdatingaproduct

内容来自zvvq,别采集哟

returnproduct;

内容来自samhan666

}

内容来自samhan666

@secured("role_admin") zvvq

publicvoiddeleteproduct(longid){ 内容来自samhan666

//logicfordeletingaproduct

内容来自samhan666

}

内容来自zvvq,别采集哟

}

本文来自zvvq

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

@springbootapplication

zvvq好,好zvvq

@enabletransactionmanagement

内容来自zvvq

@enableglobalmethodsecurity(securedenabled = true) zvvq

publicclassmasteryapplication{ zvvq

publicstaticvoidmain(string[]args){ 内容来自zvvq,别采集哟

springapplication.run(masteryapplication.class,args);

内容来自zvvq

} 内容来自samhan666

} 内容来自samhan666

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

org.springframework.securityspring-security-testtest 内容来自zvvq

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

@SpringBootTest 内容来自zvvq,别采集哟

classProductServiceTests{

zvvq

@Autowired zvvq好,好zvvq

privateProductServiceproductService; 内容来自zvvq,别采集哟

@Test zvvq好,好zvvq

@WithMockUser(roles="USER") 内容来自zvvq,别采集哟

voidtestCreateProductAsUser(){

内容来自samhan666

Productproduct=newProduct(); zvvq.cn

assertDoesNotThrow(()->productService.createProduct(product)); zvvq好,好zvvq

}

zvvq好,好zvvq

@Test

内容来自samhan666

@WithMockUser(roles="ADMIN") 本文来自zvvq

voidtestCreateProductAsAdmin(){ zvvq.cn

Productproduct=newProduct(); zvvq.cn

assertDoesNotThrow(()->productService.createProduct(product)); 本文来自zvvq

} 内容来自zvvq,别采集哟

@Test

zvvq.cn

@WithAnonymousUser

内容来自zvvq,别采集哟

voidtestCreateProductAsAnonymous(){ 本文来自zvvq

Productproduct=newProduct(); 内容来自zvvq

assertThrows(AccessDeniedException.class,()->productService.createProduct(product)); 内容来自samhan666

} 内容来自samhan666

@Test zvvq.cn

@WithMockUser(roles="USER") 内容来自samhan666

voidtestGetProductByIdAsUser(){

copyright zvvq

assertDoesNotThrow(()->productService.getProductById(1L));//AssumingproductwithID1exists 内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

@Test

zvvq

@WithMockUser(roles="ADMIN") 本文来自zvvq

voidtestGetProductByIdAsAdmin(){ 内容来自zvvq

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

内容来自samhan666

}

内容来自zvvq,别采集哟

@Test 内容来自zvvq,别采集哟

@WithAnonymousUser 内容来自zvvq,别采集哟

voidtestGetProductByIdAsAnonymous(){ 内容来自samhan666

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

zvvq.cn

}

内容来自samhan666

@Test

本文来自zvvq

@WithMockUser(roles="USER")

copyright zvvq

voidtestUpdateProductAsUser(){ 内容来自zvvq

Productproduct=newProduct();

内容来自zvvq

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

内容来自zvvq,别采集哟

}

zvvq

@Test

zvvq

@WithMockUser(roles="ADMIN") 内容来自samhan

voidtestUpdateProductAsAdmin(){ 内容来自samhan666

Productproduct=newProduct();

内容来自samhan666

assertDoesNotThrow(()->productService.updateProduct(product)); 内容来自samhan

} zvvq

@Test 内容来自zvvq

@WithAnonymousUser

zvvq.cn

voidtestUpdateProductAsAnonymous(){ 内容来自samhan

Productproduct=newProduct(); 本文来自zvvq

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

内容来自samhan

}

内容来自samhan666

@Test

内容来自samhan

@WithMockUser(roles="USER")

zvvq.cn

voidtestDeleteProductAsUser(){

内容来自zvvq,别采集哟

assertThrows(AccessDeniedException.class,()->productService.deleteProduct(1L)); 本文来自zvvq

}

内容来自samhan666

@Test

copyright zvvq

@WithMockUser(roles="ADMIN") zvvq.cn

voidtestDeleteProductAsAdmin(){ 内容来自zvvq

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

}

copyright zvvq

@Test 内容来自zvvq

@WithAnonymousUser 内容来自zvvq

voidtestDeleteProductAsAnonymous(){ 本文来自zvvq

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

} zvvq

} 内容来自samhan666

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

zvvq好,好zvvq