代码之家  ›  专栏  ›  技术社区  ›  Al Grant

antMatcher()与方法安全性

  •  1
  • Al Grant  · 技术社区  · 7 年前

    在Spring Security中,我看到URL通过以下方式进行保护:

    http
        .authorizeRequests()
            .antMatchers("/admin").hasRole("ADMIN");
    

    @PreAuthorize("hasRole('ADMIN')")
    

    是吗 antMatchers 用于在 @PreAuthorize

    如果 antMatcher 保护已经调用接口的URL,那么为什么需要单独保护接口方法?

    能否在控制器上使用方法级安全性,如:

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/dashboard/person")
    public String findEvent(Model model, HttpServletRequest request) {
    ....
    
    1 回复  |  直到 7 年前
        1
  •  11
  •   dur    7 年前

    Web安全和方法安全是保护应用程序的两种不同方法,请参阅 Spring Security Reference :

    为什么不直接使用web.xml安全性呢?

    假设您正在开发基于Spring的企业应用程序。您通常需要解决四个安全问题:身份验证、web请求安全、服务层安全(即实现业务逻辑的方法)和域对象实例安全(即不同的域对象具有不同的权限)。考虑到这些典型要求:

    1. Web请求安全性: servlet规范提供了一种保护请求URI的方法。但是,这些URI只能用servlet规范自己的有限URI路径格式表示。SpringSecurity提供了一种更全面的方法。例如,您可以使用ANT路径或正则表达式,您可以考虑URI的部分而不仅仅是所请求的页面(例如,您可以考虑HTTP GET参数),并且可以实现自己的运行时配置数据源。这意味着您的web请求安全性可以在实际执行webapp期间动态更改。

    2. 服务层和域对象安全性:

      A. 关注点的分离: 授权是一个贯穿各领域的问题,因此应予以实施。实现授权代码的MVC控制器或视图使得测试控制器和授权逻辑更加困难,调试更加困难,并且经常会导致代码重复。

      B 对富客户端和web服务的支持: 如果最终必须支持其他客户端类型,则嵌入在web层中的任何授权代码都是不可重用的。应该考虑到SpringRemoting导出程序只导出服务层bean(而不是MVC控制器)。因此,授权逻辑需要位于服务层中,以支持多种客户端类型。

      C 分层问题:

      D 授权代码质量: 人们常说web框架“使做正确的事情变得更容易,而做错误的事情变得更难”。安全框架是相同的,因为它们是以一种抽象的方式设计的,用于广泛的目的。从头开始编写自己的授权代码并不能提供框架所提供的“设计检查”,内部授权代码通常缺乏广泛部署、同行评审和新版本所带来的改进。

    Spring Security Reference

    10.1.4请求匹配和HttpFirewall

    [...]

    实际上,我们建议您在服务层使用方法安全性来控制对应用程序的访问,并且不要完全依赖于使用在web应用程序级别定义的安全约束。URL会发生变化,很难考虑应用程序可能支持的所有可能的URL以及如何处理请求。你应该试着限制自己使用一些简单易懂的蚂蚁路径。始终尝试使用“默认拒绝”方法,在这种方法中,您最后定义了一个catch-all通配符(/或),并拒绝访问。

    在服务层定义的安全性更健壮,更难绕过,因此您应该始终利用Spring Securitys的方法安全选项。

    Spring Security Reference :

    我已经将SpringSecuritys元素添加到我的应用程序上下文中,但是如果我将安全注释添加到我的SpringMVC控制器bean(Struts操作等),那么它们似乎没有效果。

    通常,我们建议在服务层而不是在单个web控制器上应用方法安全性。