【问题标题】:Grails Spring Security get assigned roles to a methodGrails Spring Security 为方法分配角色
【发布时间】:2013-04-05 17:53:48
【问题描述】:

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

@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"))

有什么建议吗? 谢谢。

【问题讨论】:

    标签: security grails functional-testing


    【解决方案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 闭包将模拟用户名的身份验证,因此说:“执行此代码,就像用户名成功登录一样”。

    看来您确实需要使用功能测试。见伯特的评论。我仍然认为创建一个测试只是为了验证方法是否具有注释不是一个有效的努力。

    【讨论】:

    • Spring Security 在集成测试中不活跃,因为它是使用过滤器链实现的,并且请求只是MockHttpServletRequests,而不是在容器中运行的真实请求。如果您想测试控制器是否受到正确保护,您必须使用功能测试。
    • 感谢@BurtBeckwith 的澄清!
    • 我知道我需要功能测试,但我仍然不知道如何获取功能的角色列表,而不是先尝试验证用户然后尝试访问一个函数。
    • 您可以通过 Java 反射 API 获取注释列表及其值。我已经完成了,但请检查我的编辑(前 3 行)。
    猜你喜欢
    • 2013-08-26
    • 2011-11-27
    • 2017-05-18
    • 1970-01-01
    • 2011-07-01
    • 2014-12-26
    • 2011-09-28
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多