0

我正在使用 Spring Security 3.1.x 并实现了方法注释证券。如我所愿,当我以没有权限的用户身份登录时执行某个操作时,我的控制台中会出现 403 access is denied !完美的!

现在我想捕捉这个 403,并给用户一个带有自定义消息的弹出窗口。我不想将用户重定向到一个说他们没有权利的页面。

Spring的访问拒绝处理程序有什么办法可以处理弹出窗口吗?还是只能重定向到另一个页面?也许我还有其他选择?

提前致谢!

4

3 回答 3

1

通常错误页面是由您的应用服务器生成的。在您的 web.xml 中,您可以为不同的错误代码定义自定义错误页面。然后,您的 Web 应用程序服务器将显示自定义错误页面而不是原始页面。

将此粘贴到您的 web.xml 文件中

<error-page>
<error-code>403</error-code>
<location>/youraccessdeniedpage.jsp</location>
</error-page>

此外,在您的 spring 安全性中添加一个拦截 url 标记,以便任何人都可以看到错误页面

<security:intercept-url pattern="/youraccessdeniedpage.jsp" access="permitAll"/>

在自定义错误页面中,您可以显示任何您想要的内容,包括弹出窗口等。

于 2013-10-17T15:52:24.603 回答
1

要执行拒绝访问逻辑,您可以实现 AccessDeniedHandler。这不完全是你想要的。它具有带有 HttpServletResponse 对象的句柄方法。所以你可以写任何你想要的消息或重定向到另一个页面。但主要问题是您必须执行一个 http 请求并加载另一个页面。这就是 Spring Security 的工作方式。但是,如果您真的想这样做,您可以尝试执行 ajax 请求并检查它是否返回 403 页面。

于 2013-10-17T15:53:00.030 回答
1

开箱即用的 Spring Security 只会发送 403 作为错误。大多数容器将为 403 状态提供默认错误页面并呈现 HTML 页面。在这种情况下没有重定向,它是一个转发。

听起来好像您正在使用 JavaScript,如果是这样,您可以检测 HTTP 状态是否为 403,然后显示您的自定义消息。如果您使用的是 JQuery,它看起来像这样

   $(document).ajaxError(function( event, jqxhr, settings, exception ) {
    if (jqxhr.status == 403 ) {
      // output custom error
    } else {
      // ...other errors...
    }
  });

只要它提供完整的响应,您就可以在自定义 AccessDeniedHandler 中做任何您想做的事情。事实上,您可以指定一个错误页面转发到另一个 URL,以便您可以根据需要使用 Spring MVC(或其他类型的)控制器处理该 URL。如果您使用的是 XML 命名空间,则可以通过以下方式完成:

<http>
    <!-- ... -->

    <access-denied-handler error-page="/403" />
</http>

然后,您可以随意处理 /403 URL。例如,如果您想设置状态并提供错误消息,您可以创建一个 Spring MVC 控制器来执行以下操作:

@Controller
public class ErrorsController {

    @RequestMapping("/403")
    public void forbidden(HttpServletRequest request, HttpServletResponse response) {
       response.setStatus(HttpServletResponse.SC_FORBIDDEN);
       response.getWritter().write("You do not have permission to perform this operation");
    }
}

然后,您的 JavaScript 可以捕获 403,然后使用响应的正文来显示消息。当然,如果您愿意,也可以将响应格式化为 JSON。

于 2013-10-17T15:59:15.250 回答