我正在使用Spring Security 3.1.x并实施了方法注释证券。正如我想要的那样,当我作为没有权限的二手登录时执行某个操作时,我的控制台中的403访问被拒绝了!完美!
现在我想抓住这个403,并给用户一个带有自定义消息的弹出窗口。我不想将用户重定向到一个页面,说他们没有权利。
Spring的access-denied-handler有没有办法处理弹出窗口?或者它只能重定向到另一个页面?也许还有其他选择吗?
提前致谢!
答案 0 :(得分:1)
通常,错误页面由应用服务器生成。 在您的web.xml中,您可以为不同的错误代码定义自定义错误页面。 然后,您的Web应用程序服务器将显示自定义错误页面而不是原始错误页面。
将其粘贴到您的web.xml文件中
<error-page>
<error-code>403</error-code>
<location>/youraccessdeniedpage.jsp</location>
</error-page>
此外,在您的弹簧安全性中添加一个intercept-url标记,以便任何人都可以看到错误页面
<security:intercept-url pattern="/youraccessdeniedpage.jsp" access="permitAll"/>
在自定义错误页面中,您可以显示所需内容,包括弹出窗口等。
答案 1 :(得分:1)
要执行拒绝访问的逻辑,您可以实现AccessDeniedHandler。这不完全是你想要的。它具有HttpServletResponse对象的句柄方法。因此,您可以编写任何所需的消息或重定向到其他页面。但主要问题是您必须执行http请求并加载另一个页面。这是Spring Security的工作方式。 但是,如果您真的想这样做,您可以尝试执行ajax请求并检查它是否返回403页面。
答案 2 :(得分: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。