在 grails + acegi 中测试 securityConfig 映射

Posted

技术标签:

【中文标题】在 grails + acegi 中测试 securityConfig 映射【英文标题】:testing securityConfig mapping in grails + acegi 【发布时间】:2011-04-19 16:27:00 【问题描述】:

我正在为一个仍然使用 Acegi 插件(不是较新的 Spring Core Security 插件)的项目编写测试用例,到目前为止,我已经成功地完成了这个站点 (http://www.zorched.net/2008/09/01/grails-testing-acegi-security/)

已建议检测当前登录的用户。但是,在我的控制器中,我的内容如下所示:

def list = 
     // code for an "admin account"


def list_others = 
     // code for other accounts

现在,我将登录用户签入控制器。相反,我在 SecurityConfig.groovy 中定义了这些:

security 
     ...
     requestMapString = """\
          /someController/list=ROLE_ADMIN
          /someController/list_others=ROLE_OTHERS
     """
     ...

因此,如果我有一个看起来像这样的测试:

void testTrial() 
     // define here that otherUser has a role of ROLE_OTHERS

     authenticate(otherUser, "other") // this calls the authenticate methode in the site I gave earlier
     controller.list()

     // I do an assertion here to check where this goes to

事情是,当我做断言时,当然 list 会告诉我它转发到 list.gsp ......即使“登录”用户的角色是 ROLE_OTHERS 而不是管理员。

但是,我需要的是如何测试登录用户只能访问的内容?在这种情况下,假设调用的是 *.list() 并且登录用户具有 ROLE_OTHERS 角色,我应该被转发到“拒绝”页面。

帮助?谢谢!

【问题讨论】:

【参考方案1】:

您需要为此进行功能测试。单元测试只是 Groovy 或 Java 类加上一些模拟。没有 Spring 应用程序上下文,没有 Hibernate,没有数据库,最重要的是在这种情况下没有插件。

集成测试为您提供了更多功能,但即使存在请求也大多是模拟的,并且由于没有容器,因此不会触发过滤器。 Spring Security(Acegi 插件使用)基于一系列 servlet 过滤器。因此,如果您想测试您的安全规则是否被正确应用,您需要一个正在运行的服务器,因此需要进行功能测试。

功能测试有多种选择,最流行的是 WebTest:http://grails.org/plugin/webtest,功能测试插件:http://grails.org/plugin/functional-test,以及 Selenium RC 插件:http://grails.org/plugin/selenium-rc。

最新的是 Geb:http://grails.org/plugin/geb。该手册位于http://geb.codehaus.org/,最近有一篇关于它的博客文章:http://blog.springsource.com/2010/08/28/the-future-of-functional-web-testing/

【讨论】:

大声笑,有点害怕它会涉及功能测试。无论如何,我会检查一下,谢谢!这很有帮助:)

以上是关于在 grails + acegi 中测试 securityConfig 映射的主要内容,如果未能解决你的问题,请参考以下文章

Grails - Acegi:自定义身份验证方法

使用 Grails 和 Acegi 自动登录

Grails,从 Acegi 升级到 Spring 安全插件

Grails Acegi 手动登录

登录页面使用 SSL,未加密页面看不到加密会话 cookie (Grails, Acegi)

Grails Acegi 安全性:角色和访问问题