【问题标题】:Spring Access Control春季访问控制
【发布时间】:2023-04-06 18:42:01
【问题描述】:

我正在开发 Spring MVC 应用程序。应用程序功能可通过包含 ajax 逻辑的 jsp 使用的 ReST API 访问。我正在使用具有定义角色(用户、公司、管理员)的弹簧安全性。方法使用 requestMapping 和 responseBody 例如:

www.app.com/auth/{userId}/request/{requestId}

当然,它支持获取资源的 GET 和创建或更新资源的 POST。 问题是,在成功登录后,例如,userId = 1 我想要使用 requestId = 99 的 GET 请求。但是当我为 Chrome 运行 WebDev 客户端时,我还可以通过简单的请求格式访问另一个资源

www.app.com/auth/5/request/{requestId}

所以基本上,我可以访问我不被允许看到的资源。我希望你明白我要去的地方。

我的问题是 - 确保这一点的最佳方法是什么? 我正在考虑在会话中存储记录的用户 ID(整数)并在每次请求资源时进行比较,但在我看来,我拉错了绳子的一端:)

感谢您的建议

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    您应该查看 spring 安全文档的 Expression-Based Access Control 部分。

    从文档中复制的示例:

      @PreAuthorize("#contact.name == authentication.name")
      public void doSomething(Contact contact) {
         ..
      }
    

    这将检查联系人的姓名是否等于当前登录用户的姓名。

    使用此功能,您可以构建比简单角色更复杂的访问规则。但是,这并不排除使用角色。您仍然可以保留角色以进行基本安全检查。

    【讨论】:

    • 所以,我现在看到的解决方案是:我有一个带有一些 RequestMapping、ResponseBody 的方法,声明是 SaveRequest(String requestName, String requestContent) 并且我必须添加参数“谁调用了”(可能唯一名称 - 登录人的用户名)例如 String 调用程序和使用 @PreAuthorize("#invoker == authentication.name") 的方法。这是正确的态度吗?
    猜你喜欢
    • 2019-02-09
    • 2016-01-21
    • 2016-09-29
    • 2023-03-25
    • 1970-01-01
    • 2020-02-04
    • 2011-07-26
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多