Spring Security:仅允许用户访问自己的管理页面

时间:2011-07-29 09:37:17

标签: spring-mvc spring-security

在我的网络应用中,用户可以更改其用户详细信息。此页面的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”

2 个答案:

答案 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文档:

Access Control using @PreAuthorize and @PostAuthorize