Grails Spring Security将角色分配给方法

时间:2013-04-05 17:53:48

标签: security grails functional-testing

我希望测试能够通过控制器中的所有可用方法并检索与这些方法相关的角色。我知道它应该是一个功能测试(而不是单元测试),但我仍然不知道如何请求与方法相关的角色列表。 假设我有这个控制器:

@Secured("hasAnyRole('ROLE_1')"
class MyController {
    def methodA() {}

    @Secured("hasAnyRole('ROLE_2')"
    def methodB() {}
 }

在我的测试中,我希望有这样的东西:

assertEquals(['ROLE_1'],getRoles(MyController.class, "methodA"))
assertEquals(['ROLE_1', 'ROLE_2'],getRoles(MyController.class, "methodB"))

有什么建议吗? 感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用Reflection API执行此操作。类似的东西:

Method m = MyController.class.getMethod("methodB");
Annotation[] annos = m.getAnnotations();

<击> 但我不认为这对您的方法是一个很好的验证,因为它只能确保您正确地编写角色名称。我认为你最好试着调用动作并检查进程是否重定向到被拒绝。

@TestFor(MyController)
class MyControllerTests {
  @Test
  void shouldRedirectToDenied() {
    SpringSecurityUtils.doWithAuth('username') {
      controller.methodB()
      assert controller.response.redirectedUrl == '/login/denied'
    }
  }
}

doWithAuth闭包将模拟用户名的身份验证,因此说:“执行此代码就像用户名已成功登录一样”。

您似乎确实需要使用功能测试。见Burt的评论。我仍然认为这不是一个有效的工作,只是为了验证该方法是否具有注释而创建测试。