对于像
这样的网址http.authorizeRequests().antMatchers("/rest/users/**").hasRole("USER");
如何确保已连接的用户只能修改其密码,而不能修改其他用户...
实际上,我对网址有保护......但这还不足以阻止这种情况
{{1}}
答案 0 :(得分:1)
假设你有一个带有用户名作为参数之一的公共方法的Spring bean(它可以在控制器,安全层,服务层或DAO中),你可以添加@PreAuthorize
注释:
@PreAuthorize("#username == authentication.name")
public void updateUserPassword(String username, String newPassword);
如果尚未在安全配置中启用注释前和注释,则必须启用注释。
答案 1 :(得分:0)
将Principal对象(如here)添加到方法的参数列表中,以确认经过身份验证的用户与API URL中的userId是同一用户(执行任何背景DAO查询都需要userId和经过身份验证的用户之间的映射)。如果不是,则返回403或404,否则更新密码。无论您是返回403还是404,最好保持一致并为未经授权和用户未找到的情况返回相同的数字,以便不向黑客提供不需要的信息。
答案 2 :(得分:0)
我认为您对/ rest / users / **进行了身份验证。您可以使用以下代码获取当前用户。
YourUserPrincipalDto dto = (YourUserPrincipalDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Long userId = dto.getUserId();
YourUserPrincipalDto应实现 UserDetails 。