拒绝访问某些继承的控制器方法

时间:2015-07-13 09:26:17

标签: spring security inheritance controller

我有一个基本的REST控制器,它提供了一般方法(GET,PUT,POST,DELETE)。

然后特定控制器继承这些方法并使用它们或覆盖它们。当这样的子类控制器覆盖继承的控制器方法时,我有时需要添加例如@PreAuthorize("hasAnyRole('ROLE_ADMIN')")来限制对某些安全角色的访问。

但是,现在我有另一个子类控制器,我只需要允许访问GET继承的方法。绝对禁止所有其他继承的方法(PUT,POST,DELETE)。

我尝试使用空@PreAuthorize覆盖DELETE:

    @PreAuthorize
    @Override
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    @ResponseStatus(HttpStatus.NO_CONTENT)
    @ResponseBody
    public void removeResource(@PathVariable("id") final Long id, final Principal principal) throws UnknownResourceException {
        // Deny access to everyone
    }

但是,没有值,它不是有效的注释。

是否有解决此问题的通常模式?

1 个答案:

答案 0 :(得分:0)

Spring建议使用HttpSecurity保护您的Mapping Handler:

  

在实践中,我们建议您在服务中使用方法安全性   图层,用于控制对应用程序的访问,并且不完全依赖   关于在web应用程序中定义的安全性约束的使用   水平。网址发生变化,很难将其全部考虑在内   应用程序可能支持的可能URL以及请求的可能方式   被操纵。你应该试着限制自己使用一些   简单的蚂蚁路径,易于理解。总是尝试使用   一个"拒绝按默认"你有一个全能通配符的方法(/ **   或**)最后定义并拒绝访问。

因此,例如,它使用URL安全性进行保护,并且可以通过Http方法区分:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    // ...
    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http
          .httpBasic().and()
          .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/myurl").hasRole("ADMIN")
            .antMatchers(HttpMethod.GET, "/myurl/**").hasRole("USER")
            .antMatchers(HttpMethod.DELETE, "/myurl/**").hasRole("ADMIN")
            .antMatchers(HttpMethod.PUT, "/myurl/**").hasRole("USER");
    }
    // ...
}