Hi,
On 16/11/11 05:45, Jeff Wang wrote:
Due to a variety of reasons, we decided to not secure our html pages,
but to secure the AJAX data calls. The AJAX endpoints are CXF JAX-RS
endpoints. Because we support OAuth and OpenID, we made the decision
to go with Spring Security and sessions, instead of the proper RESTful
authenticate-each-call methodology. We also transformed the Spring
Security settings. Relevant parts below:
<sec:http access-denied-page="/rest/auth?error=access-denied">
<sec:form-login
authentication-failure-url="/rest/auth?error=failed-login"
login-page="/rest/auth?error=not-authenticated"
default-target-url="/rest/auth/success"/>
</sec:http>
Basically, on a auth failure or a not-authorized-yet situation, we
have spring security redirect to a REST endpoint, that responds with
the proper status code and that's it. No forwarding to the login-page
or anything of that sort (which would be pointless because all these
are AJAX calls...) On a auth sucess, we would like to redirect to
/rest/api/user/15 (or whatever ID that just successfully logged in.)
But it looks like we won't be able to dynamically change the target
URL, so we'll depend on /rest/auth/success to return the URI. From
TCPMon, we see:
HTTP/1.1 302 Moved Temporarily
Set-Cookie: JSESSIONID=C149C4F73C95BDAF33E2BED4CCC1D133;
Location: http://localhost/plutom-ws/rest/auth/success
but the call to auth/success fails (stacktrace truncated to the
relevant portion):
GET /plutom-ws/rest/auth/success HTTP/1.1
Cookie: JSESSIONID=C149C4F73C95BDAF33E2BED4CCC1D133;
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: An
Authentication object was not found in the SecurityContext
How do you manage the redirection ? Is it an OpenId JSP handler which
redirects to /plutom-ws/rest/auth/success ? This is just a guess but I
I'm assuming that "/plutom-ws/rest/auth/success" is secured by a Spring
Security handler which can not understand what to do with
JSESSIONID=C149C4F73C95BDAF33E2BED4CCC1D133 in order to retrieve the
stored authenticated info if any...
at
org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:107)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:323)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:118)
at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:208)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:166)
at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:113)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:184)
at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:112)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
So a bunch of questions:
1) I annotated the auth/success endpoint with @SECURED, is this correct?
that is there in order to enforce RBAC
2) Who's responsible for looking at the cookie, finding the Spring
stored session, and setting the authentication obect? Do I need an
interceptor that I didn't add?
Spring Security filter ?
3) Is the fact that CXFNonSpringServlet is called expected? I'm
definitely not using that anywhere...
CXFServlet now extends CXFNonSpringServlet...
Cheers, Sergey
thanks for any help
Jeff