【问题标题】:protecting grails melody with grails filter用 grails 过滤器保护 grails 旋律
【发布时间】:2011-02-26 14:04:28
【问题描述】:

我有一个应用程序,我在其中使用弹簧安全性和 grails 旋律。我打算在生产环境中运行 grails melody,但不希望访问者可以访问它。我应该如何做到这一点?我尝试在 grails 中创建一个过滤器(仅显示我正在尝试的示例,而不是实际代码)-

def filters = {
    allURIs(uri:'/**') {
        before = {
            //...
            if(request.forwardURI.indexOf("admin") != -1 ||
        request.forwardURI.indexOf("monitoring") != -1) {
                response.sendError 404
                return false 
            }
        }
    }
}

但这不起作用,因为“监控”请求没有命中此过滤器。我什至不希望用户知道这样的 URL 存在,所以我想在过滤器中检查如果“监控”是 URL,我会显示 404 错误页面。这也是我不想用 spring security 保护这个 URL 的原因,因为它会显示“访问被拒绝”页面。

基本上我希望 URL 存在,但它们应该对用户不可见。我希望对这些特殊 URL 的特定 IP 地址开放访问。

另一方面,是否可以编写一个 grails 过滤器,在 spring 安全过滤器被命中之前“行动”?在将请求转发给 Spring Security 之前,我希望能够进行一些过滤。像上面那样编写一个 grails 过滤器没有帮助。如果我访问受保护的资源并且没有调用此过滤器,则 Spring 安全过滤器会首先被命中。

谢谢

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

    Grails 过滤器是 Spring 拦截器的包装器,因此它们会在 Spring Security 使用的“真实”servlet 过滤器之后触发。如果你想在 Spring Security 之前触发一些东西,你需要在 web.xml 中注册一个过滤器,或者可能在插件的过滤器链中。

    这是 IP 地址过滤器的动机之一。我们想要一个可供登录管理员使用的管理部分,但也只有在从 LAN 或 VPN 访问时才可用。 LAN 和 VPN IP 地址都以 10 开头。所以我们添加了一条规则

    '/admin/**': '10.**'
    

    过滤器发送 404 响应以隐藏资源的存在。

    有关这方面的文档,请参阅 http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/10.%20Extending%20and%20configuring%20the%20plugin.html#10.8.%20IP%20Address%20Restrictions

    【讨论】:

    【解决方案2】:

    我一直在研究如何使用 Spring Security 来保护 Grails Melody(例如 /monitoring)。我现在使用 Apache HTTP Basic 身份验证完成了它(我们使用 apache 代理到 tomcat),但这并不理想,因为我希望将应用程序部署到 CloudFoundry。

    例如,这是否也可以使用 Grails WebXmlConfig 插件轻松完成?我看到 Burt 至少对文档页面做出了贡献?我不确定该插件并没有真正记录在案......

    【讨论】:

      【解决方案3】:

      伯特的回答很好。

      另一个答案是使用 javamelody 包含的安全选项: http://code.google.com/p/javamelody/wiki/UserGuide#15._Security

      例如,您可以在 GrailsMelodyConfig.groovy 文件中添加以下参数,该参数是一个正则表达式: javamelody.'allowed-addr-pattern' = '127.0.0.1'

      【讨论】:

        【解决方案4】:

        这是我在类似场景中所做的(JavaMelody 1.29.0 和 Spring Security 3.0.5)。我想将 Melody 报告的访问权限限制为管理员用户。

        Spring 安全配置:

        <http auto-config="true" use-expressions="true">
            ...
            <intercept-url pattern="/monitoring/**" access="hasRole('ROLE_ADMIN')" />
            ...
        </http>
        

        web.xml 配置:

        <filter>
            <filter-name>springSecurityFilterChain</filter-name>
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>springSecurityFilterChain</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <filter>
            <filter-name>monitoring</filter-name>
            <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>monitoring</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        

        关键是要确保监控过滤器是在 Spring Security 过滤器链之后定义的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-04
          • 2012-05-30
          • 1970-01-01
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          相关资源
          最近更新 更多