在我的网络应用中,用户可以更改其用户详细信息。此页面的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”
答案 0 :(得分:5)
在URL上使用PathVariable
,例如@RequestMapping("/usermanagement/edituserinfo/{userid}")
,并在您的代码中针对SecurityContextHolder.getContext().getAuthentication().getPrincipal()
路径验证登录用户的Spring Security上下文原则(通过userid
)变量。如果它们不匹配,请退出用户,记录SecurityException
,然后向管理员发送电子邮件。
答案 1 :(得分:4)
您也可以使用Spring Security的支持表达式的@PreAuthorize来实现这一目标:
@PreAuthorize("#userId == principal.id")
public void doSomething(@PathVariable String userId);
参见Spring文档: