如何在grails中编写accessDeniedHandler

Posted

技术标签:

【中文标题】如何在grails中编写accessDeniedHandler【英文标题】:How to write accessDeniedHandler in grails 【发布时间】:2018-06-26 17:28:11 【问题描述】:

我是 groovy 的新手,我已经通过以下方式在 grails 中实现了 CSRF Token。 在resource.groovy中添加CSRF过滤器

csrfFilter(CsrfFilter, new HttpSessionCsrfTokenRepository()) 
        accessDeniedHandler = ref('fnAccessDeniedHandler')
        requireCsrfProtectionMatcher = ref('fnRequireCsrfProtectionMatcher')
    

但我不知道如何初始化 fnAccessDeniedHandler 和 fnRequireCsrfProtectionMatcher 。 提前致谢。

【问题讨论】:

只是指出您不必提供它们,您可以使用默认值 【参考方案1】:

ref 中的值必须是一个 bean(https://docs.grails.org/latest/guide/spring.html)。如果要覆盖 accessDeniedHandler 和 requireCsrfProtectionMatcher,则需要创建自定义类,并在 resources.groovy 中创建 bean。例如,要创建 bean fnAccessDeniedHandler,您可以执行以下操作。

在resources.groovy中添加以下内容

fnAccessDeniedHandler(CustomAccessDeniedHandler)

并创建一个实现 AccessDeniedHandler 的类 CustomAccessDeniedHandler。

public class CustomAccessDeniedHandler implements AccessDeniedHandler 

    public static final Logger LOG
      = Logger.getLogger(CustomAccessDeniedHandler.class);

    @Override
    public void handle(
      HttpServletRequest request,
      HttpServletResponse response, 
      AccessDeniedException exc) throws IOException, ServletException 

        Authentication auth 
          = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) 
            LOG.warn("User: " + auth.getName() 
              + " attempted to access the protected URL: "
              + request.getRequestURI());
        

        response.sendRedirect(request.getContextPath() + "/accessDenied");
    

【讨论】:

以上是关于如何在grails中编写accessDeniedHandler的主要内容,如果未能解决你的问题,请参考以下文章

如何在Grails中使用自定义身份验证过滤器?

如何从另一个 grails 插件配置 grails 插件

Grails 可以编写响应吗?

如何在Grails的多个字段中订购?

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

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