保护Grails旋律与grails过滤器

时间:2010-06-01 22:33:57

标签: grails spring-security

我有一个应用程序,我使用spring security和grails melody。我打算在生产环境中运行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安全保护这个URL的原因,因为它会显示“访问被拒绝”页面。

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

另一方面,是否有可能在弹出安全过滤器之前编写一个“动作”的grails过滤器?我想在将请求转发给spring security之前能够进行一些过滤。写上面的grails过滤器没有帮助。如果我访问受保护的资源并且没有调用此过滤器,则会首先触发Spring安全过滤器。

由于

4 个答案:

答案 0 :(得分:4)

Grails过滤器是Spring Interceptors的包装器,所以它们会在像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

答案 1 :(得分:1)

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

例如,这可以使用Grails WebXmlConfig插件轻松完成吗?我看到Burt已经贡献了至少 - 文档页面?我不确定该插件是否真的没有记录......

答案 2 :(得分:0)

Burt的答案很好。

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

例如,您可以在GrailsMelodyConfig.groovy文件中添加以下参数,即regexp: javamelody.'allowed-addr-pattern'='127.0.0.1'

答案 3 :(得分:0)

这是我在类似场景中所做的(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 config:

<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过滤器链之后定义了监控过滤器。