在 Grails 中,如何在自动化测试中测试 @Secured 注解?

Posted

技术标签:

【中文标题】在 Grails 中,如何在自动化测试中测试 @Secured 注解?【英文标题】:In Grails, how do I test @Secured annotations in automated tests? 【发布时间】:2013-05-26 19:10:50 【问题描述】:

我有一个控制器方法,我正在这样注释:

@Secured(['ROLE_ADMIN'])
def save() 
    ... // code ommitted

我正在尝试编写一个单元测试来验证只有管理员用户才能访问该 URL:

def "Only the admin user should be able to invoke save"() 
    given:
    def user = createNonAdminUser() // let's pretend this method exists
    controller.springSecurityService = Mock(SpringSecurityService)
    controller.springSecurityService.currentUser >> user

    when:
    controller.save()

    then:
    view ==~ 'accessdenied'

但是,返回的视图是save 视图,而不是拒绝访问视图。看起来它完全绕过了 @Secured 注释。有没有办法从单元测试或集成测试中测试@Secured 注释?

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

如果您还没有在createNonAdminUser() 中调用控制器保存,则需要先登录用户。

SpringSecurityUtils.reauthenticate username, password

可能与this问题有关。

【讨论】:

【参考方案2】:

试试这个:

SpringSecurityUtils.doWithAuth('superuser') 
    controller.save()

http://greybeardedgeek.net/2011/05/13/testing-grails-controllers-with-spock/

【讨论】:

以上是关于在 Grails 中,如何在自动化测试中测试 @Secured 注解?的主要内容,如果未能解决你的问题,请参考以下文章

如何加快 Grails 测试执行

如何在 grails 3 中运行单个集成测试?

Grails - 在哪里放置测试文件以及如何加载它们

如何使用 grails 在单元测试中模拟 springSecurityService

如何在 Spock 控制器测试中模拟 Grails 请求对象方法

您如何在 grails 2.3 中测试服务或控制器方法