2014-09-30 6 views
2

Предполагая, что у меня есть main.jsp, которые включают в себя другую защищенную страницуКак обезопасить включенный страницу с Spring безопасности

<% 
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 Security Allows Unauthorized User Access to Restricted URL from a Forward

можно ли крепят включенный JSP? Если нет, то почему? Я предполагаю, что причина заключается в том, что мы используем диспетчер запросов, мы все еще передаем исходный запрос, поэтому фильтр защиты от вирусов знает только исходный путь запроса (main.jsp) и не знает целевой путь (защищенный.jsp). Поэтому он не блокирует включение защищенного.jsp

но он не работает. Я использую Spring security 3.1.2.

+0

'once-per-request' должно быть установлено как' false'. –

+0

@PavelHoral Спасибо. но он не работает. – Hawk

ответ

1

Включение JSP в основном означает вложение содержимого другого JSP в документ текущего вывода (html). Как сказал сан-криш, эти JSP-компоненты не проходят сервлет-фильтрацию.

Их основная цель - использовать каждый раз, когда у вас есть многоразовые JSP, например для навигации или разбивки на страницы. Обычно они не отображаются контейнером сервлетов. Следовательно, они должны жить под WEB-INF.

Вы не раскрыли достаточную информацию о своем приложении. Но кажется, что вы пытаетесь направить несколько страниц внутри одного JSP.

Рассмотрите это как дефект дизайна. Ваш взгляд (JSP) должен просто отображать данные модели, а ваш контроллер (HttpServlet или даже лучше Spring MVC обработчик запроса) должен решить, следует ли использовать JSP A или B для рендеринга.

Если я ошибаюсь в своем предположении - извините за шум.

Если вы пытаетесь показать пользователю различный контент после входа в систему, вам следует рассмотреть возможность создания пользовательского AuthenticationSuccessHandler, который перенаправляет на разные JSP на основе ролей, связанных с principal.

Если вы просто хотите, чтобы показать или скрыть содержимое страницы на основе роли пользователя, вы должны использовать Spring Security's Taglib:

Включить артефакт Spring Security TagLib в вашем pom.xml (я беру 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> 
+0

Спасибо. Я согласен с тем, что включение защищенной страницы может быть немного странным в перспективе использования. Значок авторизации Spring также является правильным решением, которое я нашел. – Hawk

1

Как вы, include страница jsp в вашем main.jsp, она не подвергается операции фильтра сервлета. В других словах он не достигает сервера, а не компилируется и размещается на главной странице.

Концепция весенней безопасности основана на ServletFilter, поскольку вы включили страницу, не перехваченная весной, она не препятствует ее доступу.

Надеюсь, что это поможет!

Смежные вопросы