2013-05-12 7 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> 

그리고 이것은 *의 - 보안 - XML이다 : 나는이 로그인에 대한 메시지가있어 forAuthenticated.jsp에 액세스하려고하면

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

. test/test를 입력 한 후에 forAuthenticated 페이지에는 액세스하지만 admin/adminUsers.jsp에는 액세스하지 않습니다. 괜찮 았지만 문제는 index.jsp에서 프린시 펄에 액세스 할 수 없다는 것입니다. 이것은 test/test로 로그인했을 때 index.jsp가 출력하는 것입니다. 나는 not logged inlogged in 흔적을 볼 수 없습니다 : 나는 무엇을

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

Logout 

를 놓친 거지? 나는 무엇을 두 번 ckeck()해야합니까? 봄 보안 필터 체인을 건너 뛰는 핸들러 메소드에 바로 파견 할 효과적으로 주어진 패턴과 일치하는 요청이 발생

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

: Karthikeyan 그의 주석에서 알 수 있듯이

+0

귀하의 index.jsp 보안 아무도 확보 다른 페이지에서 그것을 시도가 없습니다. –

답변

1

이 문제는 다음 행입니다. 이 경우에도 SecurityContext이 초기화되지 않으므로 인증 된 객체는 포장 된 내용을 표시할지 여부를 결정해야하는 <sec:authorize> 태그에 사용할 수 없으므로 기본적으로 표시되지 않습니다.

reference doc

도 명확하게 진술한다 :

요청 패턴 없음이 특성 (security)를 설정함으로써, 빈 필터 체인에 매핑 될 수있다. 보안은 적용되지 않으며 Spring Security의 기능 중 어느 것도 사용할 수 없습니다.

대신 빈 필터 체인을 매핑, 당신은 단순히 익명 액세스를 허용해야합니다

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

예, 그게 전부입니다. 일단 인증을 받으면 로그 아웃까지 모든 요청에 ​​대해 교장이 존재할 것이라고 생각했습니다. –

+0

인증 객체는 기본적으로 http 세션 속성에 저장되므로 올바른 것입니다. 'security = "none"의 문제는 저장된 세션 속성을 읽음으로써 스레드 로컬'SecurityContextHolder'를 초기화하는 책임을지는 보안 필터 ('SecurityContextPersistenceFilter')조차도 건너 뛴다는 것입니다. 여전히 * 거기에 있지만 다시로드 할 수있는 것은 없습니다. 이론적으로 직접 세션에서 수동으로 가져올 수도 있습니다. – zagyi

관련 문제