【问题标题】:Deny access to some inherited controller methods拒绝访问某些继承的控制器方法
【发布时间】:2015-07-13 09:26:17
【问题描述】:

我有一个提供通用方法(GET、PUT、POST、DELETE)的基本 REST 控制器。

然后特定的控制器继承这些方法并使用它们或覆盖它们。当这样的子类控制器覆盖继承的控制器方法时,我有时需要添加例如@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
    }

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

有解决这个问题的常用模式吗?

【问题讨论】:

    标签: spring security inheritance controller


    【解决方案1】:

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

    在实践中,我们建议您在服务中使用方法安全性 层,用于控制对您的应用程序的访问,而不是完全依赖 关于使用在 Web 应用程序中定义的安全约束 等级。 URL 发生变化,很难考虑到所有 应用程序可能支持的可能 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");
        }
        // ...
    }
    

    【讨论】:

    • 我也有一个通用服务实现,所以我在服务层也会遇到同样的问题。
    • 此外,我认为它不是 Spring 的好建议。因为控制器层并不意味着经常更改,因为它是可公开访问的部分(API)。然而,服务层可以更改,它不应影响 API 层中的权限。如果我将 PreAuthorize 注释移动到服务层,那么理解和维护每个 API url 的访问会更加困难。并不是所有的官方建议都可以这样接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多