2013-05-12 5 views
0

Я некоторое время играю с весной, и по какой-то причине я не могу получить доступ к основному лицу в JSP, даже когда работают аутентификация и авторизация.Весна-безопасность: куда пошел Принципал?

Это мой index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 

<%@ page import="org.springframework.security.core.context.SecurityContextHolder" %> 

<a href="forAuthenticated.jsp">for authenticated</a><br/> 
<a href="admin/adminUsers.jsp">for admins</a> 

<sec:authorize access="! isAuthenticated()"> 
    not logged in 
</sec:authorize> 
<sec:authorize access=" isAuthenticated()"> 
    logged in 
</sec:authorize> 

Your principal object is....: <sec:authentication property="principal.username" /><br/> 
Authentication = <%=SecurityContextHolder.getContext().getAuthentication() %> 

<p><a href="j_spring_security_logout">Logout</a></p> 

И это * -Security-XML:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <http pattern="/loggedout.jsp" security="none"/> 
    <http pattern="/index.jsp"  security="none"/> 
    <http pattern="/login.jsp"  security="none"/> 

    <http auto-config="true"> 
    <intercept-url pattern="/admin/*"  access="ROLE_ADMIN,ROLE_SUPERUSER" /> 
    <intercept-url pattern="/forAuthenticated.jsp" access="ROLE_USER" /> 
    <intercept-url pattern="/logoutSuccess*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/**"   access="ROLE_USER" /> 

    <form-login login-page="/login.jsp" 
       authentication-failure-url = "/login.jsp?login_error=1"/> 
    <logout logout-success-url="/loggedout.jsp" delete-cookies="JSESSIONID"/> 
    <session-management invalid-session-url="/sessionTimeout.htm" /> 
    </http> 

    <global-method-security pre-post-annotations="enabled"/> 

    <authentication-manager alias="authenticationManager"> 
    <authentication-provider> 
    <user-service id="userDetailsService"> 
     <user name="username" password="password" authorities="ROLE_USER, ROLE_ADMIN" /> 
     <user name="test" password="test" authorities="ROLE_USER" /> 
    </user-service> 
    </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

Когда я пытаюсь получить доступ к forAuthenticated.jsp я пробужден для входа в систему , После ввода теста/теста я обращаюсь к странице forAuthenticated, но не к admin/adminUsers.jsp. Это нормально, но проблема в том, что я не могу получить доступ к основному в index.jsp. Это то, что index.jsp печатает при регистрации в качестве теста/теста. Обратите внимание, что я не могу увидеть not logged in ни logged in следов:

for authenticated 
for admins 
Your principal object is....: 
null 

Logout 

Что мне не хватает? что я должен сделать double-ckeck()?

+0

Ваш index.jsp имеет ни безопасность не попробовать его на другую страницу, которая прикреплена. –

ответ

1

Как Картикеян предлагает в своем комментарии, проблема следующая строка:

<http pattern="/index.jsp" security="none"/> 

, которая эффективно вызывает запросы, соответствующие заданному шаблону, чтобы быть отправлены прямо в методе обработчика пропуска фильтра цепи Spring Security. В этом случае даже не инициализируется SecurityContext, поэтому объект аутентификации не будет доступен для тега <sec:authorize>, на основании которого он должен принять решение о том, следует ли показывать завернутый контент (и, по-видимому, это будет не по умолчанию).

The reference doc утверждает, это ясно, а также:

Запрос шаблон может быть отображен в пустой цепочке фильтров, установив этот атрибут (security) на нет. Безопасность не будет применяться, и ни одна из функций Spring Security не будет доступна.

Вместо отображения пустой цепочки фильтров, вы должны просто разрешить анонимный доступ:

<sec:intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
+0

да, это было. Я подумал, что после аутентификации директор будет там для каждого запроса до выхода из системы –

+0

Это верно, поскольку объект аутентификации в основном хранится в атрибуте сеанса http. Проблема с 'security =" none "заключается в том, что он пропускает даже фильтр безопасности (' SecurityContextPersistenceFilter'), который отвечает за инициализацию локального «SecurityContextHolder» в потоке, читая хранимый атрибут сеанса. Он * * все еще существует, но нет ничего, что могло бы перезагрузить его. Теоретически вы могли бы даже получить его вручную из сеанса самостоятельно ... – zagyi

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