在带有Spring Security的Spring MVC中,有可能实现这一目标吗?
@Override WebSecurityConfigurerAdapter.configure(HttpSecurity)
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.authorizeRequests()
.mvcMatchers("/users/{authentication.principal.username}").hasAnyRole(ADMIN, MANAGER)
.antMatchers("/users/**").hasRole(ADMIN)
.anyRequest().authorized()
...
}
/users/**
是一个受限制的区域,只有管理员可以访问。但是管理人员仍然应该能够看到他们自己的个人资料(/users/user_with_manager_role
),并且只能看到他们自己的个人资料,而不是其他任何用户的个人资料(无论其角色如何)。解决方案
我在安德鲁的答案中找到了解决方案。我的代码现在看起来像这样:
WebSecurityConfigurerAdapter
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // added this annotation
public class SecurityConfig extends WebSecurityConfigurerAdapter
@Override WebSecurityConfigurerAdapter.configure(HttpSecurity)
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.authorizeRequests()
// removed /users handling
.anyRequest().authorized()
...
}
UsersController
@Controller
@RequestMapping("/users")
public class UsersController
{
@GetMapping("{username}")
@PreAuthorize("authentication.principal.username == #username) || hasRole('ADMIN')")
public String usersGet(@PathVariable("username") String username)
{
// do something with username, for example get a User object from a JPA repository
return "user";
}
}
最佳答案
恐怕这是不可能的:设置此配置时,它没有有关{authentication.principal.username}
的信息,将来会在某个时候解决该信息。
但是Spring提供了许多内置的method security expressions,您可以使用它们来注释您的方法。
从像@PreAuthorize("hasRole('ADMIN')")
这样的简单表达式开始,您可能会得到一个自定义的表达式:
@XMapping(path = "/users/{username}")
@PreAuthorize("@yourSecurityService.isMyPage(authentication.principal, #username)")
public void yourControllerMethod(@PathVariable String username);
@yourSecurityService.isMyPage(authentication.principal, #username)
指的是您的@Service
方法public boolean isMyPage(Principal, String)
。关于java - Spring Security允许每个用户看到他们自己的个人资料,但没有其他人可以查看,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52757368/