【问题标题】:Spring Security: allow user only to access their own administration pageSpring Security:只允许用户访问他们自己的管理页面
【发布时间】:2015-04-02 10:32:11
【问题描述】:

在我的网络应用中,用户可以更改他们的用户详细信息。此页面的 URL 是:

springproject/usermanagement/edituserinfo/4

其中“4”是用户 ID。

我的安全上下文如下所示:

<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/usermanagement" access="isAuthenticated()" />
    <security:intercept-url pattern="/usermanagement/new" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/usermanagement/edit/*" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/usermanagement/edituserinfo/*" access="isAuthenticated()" />  
</security:http>

如何限制用户只能访问他们自己的“edituserinfo”页面?例如。用户 ID 为 1 的用户只能访问:“springproject/usermanagement/edituserinfo/1”而不是“springproject/usermanagement/edituserinfo/4”

【问题讨论】:

  • 你真的需要在 URL 中传递用户 ID 吗?理想情况下,您的 URL 应该只是 springproject/usermanagement/edituserinfo。您应该将 Java 代码中的用户 ID 检索为 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 并使用它来加载用户详细信息。这将确保用户只能查看和编辑自己的详细信息,而不能查看和编辑其他人的详细信息。

标签: spring-mvc spring-security


【解决方案1】:

您也可以使用支持表达式的 Spring Security 的 @PreAuthorize 来完成此操作:

@PreAuthorize("#userId == principal.id")
public void doSomething(@PathVariable String userId);

查看 Spring 文档:

Access Control using @PreAuthorize and @PostAuthorize

【讨论】:

    【解决方案2】:

    在 URL 上使用 PathVariable,例如 @RequestMapping("/usermanagement/edituserinfo/{userid}"),并在您的代码中针对 userid 路径变量验证登录用户的 Spring Security 上下文原则(通过 SecurityContextHolder.getContext().getAuthentication().getPrincipal())。如果它们不匹配,则将用户退回,登录SecurityException,并向管理员发送电子邮件。

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 2017-10-29
      • 2020-11-04
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2017-12-21
      相关资源
      最近更新 更多