【问题标题】:security to url for a user用户 url 的安全性
【发布时间】:2016-06-22 01:38:11
【问题描述】:

对于像这样的网址

@RequestMapping(value = "/users/{userId}/update/password", method = RequestMethod.PUT)

如何确保连接的用户只能修改其密码,而不能修改其他用户的密码...

实际上,我对 url 有保护...但不足以防止这种情况

http.authorizeRequests().antMatchers("/rest/users/**").hasRole("USER");

【问题讨论】:

  • 如果您分享更多代码,您可能会得到更准确的答案。
  • 没有代码,我在做之前先问一个问题。
  • 检查连接用户的ID是否与URL中的用户ID一致。

标签: spring spring-security


【解决方案1】:

假设你有一个 Spring bean 有一个公共方法,其中用户名作为参数之一(它可以在控制器、安全层、服务层或 DAO 中),你可以添加一个@PreAuthorize 注释:

@PreAuthorize("#username == authentication.name")
public void updateUserPassword(String username, String newPassword);

如果尚未启用,您必须在安全配置中启用前注和后注。

【讨论】:

  • 我也会这样做,但在服务层。它真的不应该在 DAO 上。
  • 无论如何,赞成,因为至少您使用 AOP 模式而不是在不应处理它的类中编码安全性。
  • 为什么不在控制器上?
  • @bernardderomme 如果 userId 和 username 一样,你可以把它放在控制器上。
【解决方案2】:

我怀疑你对 /rest/users/** 进行了身份验证。您可以使用以下代码获取当前用户

YourUserPrincipalDto dto = (YourUserPrincipalDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long userId = dto.getUserId();

YourUserPrincipalDto 应该实现 UserDetails

【讨论】:

  • 好的,所以没有办法在这个命令中进行这种检查:http.authorizeRequests().antMatchers("/rest/users/**").hasRole("USER");
【解决方案3】:

Principal 对象(如here)添加到方法的参数列表中,以确认经过身份验证的用户与API URL 中的userId 是同一用户(执行任何后台DAO 查询以在userId 之间进行映射)和经过身份验证的用户)。如果不是,则返回 403 或 404,否则更新密码。无论您返回 403 还是 404,最好保持一致并在未经授权和未找到用户的情况下返回相同的数字,以免向黑客提供不需要的信息。

【讨论】:

  • 如果我找不到带有 authorizeRequests 的东西,这很有趣......我可以使用这种方式 + authorizeRequests
猜你喜欢
  • 2011-05-26
  • 2015-12-03
  • 2015-03-14
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多