0

我正在使用 Grails 2.2.3 和 Spring Security ACL 插件 1.1.1,我希望有一个对公众开放的 URL,并且使用@PostAuthorize注释的服务层可以保护资源。我们这样做是因为要确定用户是否有权访问特定对象,我们需要先查看该对象。

我想做的是在控制器层捕获 AccessDeniedException,然后让浏览器请求凭据并重试。我尝试了将响应状态设置为 401 并重定向回自身以重试的天真的方法。我遇到的问题是浏览器从未要求提供凭据。

要将其放入代码中,我想做的是在控制器层中:

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
   try {
      someService.action()
   } catch (AccessDeniedException ade) {
      // if logged in show FORBIDDEN, if not ask for credentials and try again
   }
}

服务层将简单地具有:

@PostAuthorize("""returnObject.availability == 'ALL'""")
def action() {
   PersistedObject.findById(1)
}

谢谢你的帮助!

4

1 回答 1

0

我最终解决了这个问题,结果发现我缺少一个需要连同 401 状态代码一起发送的标头。

要纠正我在您想要做的事情之上的内容:

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
   try {
      someService.action()
   } catch (AccessDeniedException ade) {
      if (!springSecurityService.isLoggedIn()) {
         response.setHeader 'WWW-Authenticate', 'Basic realm="Grails Realm"' // the missing line
         response.sendError HttpServletResponse.SC_UNAUTHORIZED 
   }
}

提交凭据后,我正在寻找的“重定向”会在浏览器中自动发生。我误认为需要特定于重定向的东西。

于 2014-01-13T19:12:58.253 回答