为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Security 允许每个用户查看他们自己的个人资料,但不允许其他用户查看

Spring Security 允许每个用户查看他们自己的个人资料,但不允许其他用户查看

倚天杖 2021-11-11 16:21:07
在带有 Spring Security 的 Spring MVC 中,是否可以实现这一点?@Override WebSecurityConfigurerAdapter.configure(HttpSecurity)@Overrideprotected 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),并且只能看到他们自己的个人资料,而不是任何其他用户的个人资料(无论他们的角色如何)。解决方案我在安德鲁的回答中找到了解决方案。我的代码现在看起来像这样:网络安全配置器适配器@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true) // added this annotationpublic class SecurityConfig extends WebSecurityConfigurerAdapter@Override WebSecurityConfigurerAdapter.configure(HttpSecurity)@Overrideprotected void configure(HttpSecurity http) throws Exception{    http            .authorizeRequests()            // removed /users handling            .anyRequest().authorized()    ...}用户控制器@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";    }}
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

恐怕这是不可能的:在设置此配置时,它没有关于{authentication.principal.username}将来某个时候将要解决的信息。


但是 Spring 为您提供了一堆内置的方法安全表达式,您可以使用它们来注释您的方法。


从一个简单的表达式开始,比如@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)。


查看完整回答
反对 回复 2021-11-11
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这样的事情怎么样:


@Override

protected void configure(HttpSecurity http) throws Exception

{

    http

            .authorizeRequests()

            .antMatchers(HttpMethod.GET, "/myself").hasAnyRole(ADMIN, MANAGER)

            .antMatchers("/users/**").hasRole(ADMIN)

            .anyRequest().hasAnyRole(ADMIN, MANAGER)

    ...

}


@RequestMapping(value = "/myself", method = RequestMethod.GET)

public Profile getMyself() {

    // return the profile of the loged in user

}

使用此经理和管理员可以获得他们自己的配置文件,管理员还可以使用 请求其他配置文件/users/{username}。


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 291 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信