2014-09-30 65 views
2

包含的頁面假設我有一個main.jsp中,其中包括其他受保護的頁面如何安全使用Spring Security

<% 
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> 

目前,我發現了什麼是:

  • 春季安全過濾器實際上是被調用的。
  • protected.jsp仍然顯示在main.jsp中。 (但我希望protected.jsp將由彈簧安全封鎖)

我已閱讀相關的討論: Spring Security Allows Unauthorized User Access to Restricted URL from a Forward

是能夠確保一個包含的JSP?如果不是,爲什麼? 我猜是因爲我們使用請求調度程序的時候,我們仍然通過原始請求,所以spring安全篩選器只知道原始請求路徑(main.jsp)並且不知道目標包含路徑(protectected.jsp)。因此,它不會阻止保護對象包含在內,但它不起作用。 我使用Spring安全性3.1.2。

+0

'一次每個請求'必須設置爲'false'。 – 2014-09-30 08:08:56

+0

@PavelHoral謝謝。嘗試過但它不起作用。 – Hawk 2014-09-30 08:22:20

回答

1

包含JSP基本上意味着將另一個JSP的內容內聯到當前輸出(html)文檔中。由於san-krish提到這些JSP包括不經過servlet過濾操作。

它們的主要目的是在您有可重用的JSP時使用,例如用於導航或分頁。 通常,它們不會被servlet容器暴露。因此,他們應該活在WEB-INF之下。

您沒有透露有關您的應用程序的足夠信息。但似乎你正試圖在一個JSP內部路由到不同的頁面。

認爲這是一個設計缺陷。您的視圖(JSP)應該只呈現模型數據,並且您的控制器(HttpServlet或更好的Spring MVC請求處理程序)應該決定是否應該採用JSP A或B進行呈現。

如果我錯了我的假設 - 對於噪音抱歉。

如果您嘗試在登錄後向用戶顯示不同的內容,則應考慮實施自定義AuthenticationSuccessHandler,該定製基於連接到principal的角色重定向到不同的JSP。

如果你只是想顯示或隱藏基於用戶角色頁面的內容,你應該利用Spring Security's Taglib

包括在你pom.xml(我拿的Maven是理所當然的)Spring Security的標籤庫神器。

<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"%> 

和環繞includeauthorize標籤。更好的是,您應該將authorize轉換爲protected.jsp以獲得更好的可重用性。

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

謝謝。我同意,從用例的角度來看,包含受保護的頁面可能有點奇怪。 Spring的授權標籤也是我找到的合適解決方案。 – Hawk 2014-10-01 06:36:08

1

由於您的include是您的main.jsp中的jsp頁面,因此它不經過servlet過濾操作。換句話說,它不會到達服務器,而是編譯並放置在主頁面中。

彈簧安全的概念是基於ServletFilter,因爲您包含的頁面不會被彈簧安全攔截,它不會阻止其訪問。

希望這有助於!

相關問題