首页 > Java > java教程 > 正文

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

WBOY
发布: 2024-07-12 09:31:02
转载
646人浏览过

spring 中使用 @secured 注解的方法安全性

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

它将使用角色来检查用户是否有权限调用该方法。注解是 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 依赖项:

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-security</artifactid>
</dependency>
登录后复制

使用@secured注释方法

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

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
    }
}
登录后复制

应用配置

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

@springbootapplication
@enabletransactionmanagement
@enableglobalmethodsecurity(securedenabled = true)
public class masteryapplication {

    public static void main(string[] args) {
        springapplication.run(masteryapplication.class, args);
    }

}
登录后复制

测试行为

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

<dependency>
    <groupid>org.springframework.security</groupid>
    <artifactid>spring-security-test</artifactid>
    <scope>test</scope>
</dependency>

登录后复制

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

@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));
    }
}
登录后复制

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

如果你喜欢这个话题,记得关注我。在接下来的几天里,我将详细解释 spring 注解!敬请期待!

跟我来!

以上就是Spring 中使用 @Secured 注解的方法安全性的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:dev.to网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号