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

jor*_*gen 4 spring-mvc spring-security

在我的Web应用程序中,用户可以更改其用户详细信息。该页面的URL为:

springproject/usermanagement/edituserinfo/4
Run Code Online (Sandbox Code Playgroud)

其中“ 4”是用户标识。

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

@PreAuthorize("#userId == principal.id")
public void doSomething(@PathVariable String userId);
Run Code Online (Sandbox Code Playgroud)

请参阅Spring文档:

使用@PreAuthorize和@PostAuthorize的访问控制


atr*_*ain 6

PathVariable在URL上使用,就像@RequestMapping("/usermanagement/edituserinfo/{userid}")和在代码中那样,SecurityContextHolder.getContext().getAuthentication().getPrincipal()针对useridpath变量验证登录用户的Spring Security上下文原理(通过)。如果不匹配,请跳出该用户,登录SecurityException,然后向管理员发送电子邮件。