如何使用Spring安全性保护包含的页面

时间:2014-09-30 08:04:31

标签: java jsp spring-security

假设我有一个main.jsp,其中包含另一个受保护的页面

<%
RequestDispatcher rd = request.getRequestDispatcher("secure/protected.jsp");
rd.include(request, response);
%>


<http auto-config="true" once-per-request="true">
        <intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR" />
....
</http>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

目前,我发现的是:

  • 实际上调用了Spring安全过滤器。
  • protected.jsp仍显示在main.jsp中。 (但我希望protected.jsp会被spring spring阻止)

我已阅读相关讨论: Spring Security Allows Unauthorized User Access to Restricted URL from a Forward

是否可以保护包含的jsp?如果没有,为什么? 我想原因是当我们使用请求调度程序时,我们仍然传递原始请求,因此spring安全过滤器只知道原始请求路径(main.jsp)并且不知道目标包含路径(protectected.jsp)。因此,它不会阻止包含protectected.jsp

但它不起作用。 我使用Spring security 3.1.2。

2 个答案:

答案 0 :(得分:2)

包含JSP基本上意味着将另一个JSP的内容内联到当前输出(html)文档中。 正如san-krish所提到的,这些JSP包括不进行servlet过滤操作。

只要您拥有可重用的JSP(例如导航或分页),它们的主要用途就是使用它们。 通常,它们不会被servlet容器暴露。因此,他们应该生活在WEB-INF

之下

您没有透露有关您的申请的足够信息。但似乎您正试图在一个JSP中路由到不同的页面。

认为这是一个设计缺陷。您的视图(JSP)应该只呈现模型数据,而您的控制器(HttpServlet或甚至更好的Spring MVC请求处理程序)应该决定是否应该使用JSP A或B进行渲染。

如果我的假设出错了 - 抱歉是噪音。

如果您尝试在登录后向用户显示不同的内容,则应考虑实施自定义AuthenticationSuccessHandler,该自定义Spring Security's Taglib会根据附加到principal的角色重定向到不同的JSP。

如果您只想根据用户角色显示或隐藏页面内容,则应使用{{3}}:

pom.xml中包含Spring Security Taglib工件(我认为Maven是理所当然的。)

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>

将taglib添加到JSP中。

<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags"%>

使用include标记环绕authorize。更好的是,您应该将authorize移到protected.jsp以获得更好的可重用性。

<security:authorize ifAllGranted="ROLE_SUPERVISOR">
    <jsp:include page="secure/protected.jsp" />
</security:authorize>

答案 1 :(得分:1)

当你在main.jsp中使用include jsp页面时,它不会进行servlet过滤操作。换句话说,它不会到达服务器而是编译并放置在主页面中。

Spring安全性的概念基于ServletFilter,因为您包含的页面不会受到Spring安全性的拦截,因为它无法阻止其访问。

希望这会有所帮助!!

相关问题