2012-01-12 4 views
39

Antes de comenzar, debo decir que la respuesta más cercana que he encontrado es here pero, sinceramente, no entiendo realmente lo que está pasando alli.Struts2 + Spring Security 2.06: Valuestack es nulo cuando se intenta utilizar @Secured en un método de acción

Estoy usando Struts2 + Spring Security 2.06 con un proveedor de autenticación personalizado y un administrador de decisiones de acceso para eliminar la necesidad de un prefijo "ROLE_".

Mi applicationContext-security.xml se ve así:

<beans:bean id="customAuthenticationProvider" 
       class="com.test.testconsole.security.CustomAuthenticationProvider"> 
     <beans:property name="userManagementService" ref="userManagementService"/> 
     <custom-authentication-provider/> 
    </beans:bean> 

    <!--Customize Spring Security's access decision manager to remove need for "ROLE_" prefix--> 
    <beans:bean 
      id="accessDecisionManager" 
      class="org.springframework.security.vote.AffirmativeBased"> 
     <beans:property name="decisionVoters"> 
      <beans:list> 
       <beans:ref bean="roleVoter"/> 
       <beans:ref bean="authenticatedVoter"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <beans:bean 
      id="roleVoter" 
      class="org.springframework.security.vote.RoleVoter"> 
     <beans:property name="rolePrefix" value=""/> 
    </beans:bean> 

    <beans:bean 
      id="authenticatedVoter" 
      class="org.springframework.security.vote.AuthenticatedVoter"> 
    </beans:bean> 

<global-method-security secured-annotations="enabled" access-decision-manager-ref="accessDecisionManager"/> 

La parte relevante de mi web.xml:

<!--Spring Security--> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class> 
     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
    </filter-class> 
</filter> 

<!--Has to be placed _Before_ the struts2 filter-mapping--> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Y estoy simplemente usando @Secured en una de mis clases de acción así:

@Secured({"TEST_ADMIN"}) 
public String editAccount() { 
    logger.info("Editing account for: " + email); 
    //blah blah blah 
} 

con la anotación @Secured añadido a un método en la acción, todos los parámetros se vuelven nula De hecho parece que el ValueStack es nulo:

154379 [[email protected]] DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler - Entering nullPropertyValue [target=[[email protected], [email protected]], property=currentPage]   
154379 [[email protected]] WARN com.opensymphony.xwork2.ognl.OgnlValueStack - Caught an exception while evaluating expression 'currentPage.equals('Summary')' against value stack 
    java.lang.NullPointerException: target is null for method equals 
     at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1347) 
     at ognl.ASTMethod.getValueBody(ASTMethod.java:90) 
     at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) 
     at ognl.SimpleNode.getValue(SimpleNode.java:258) 
     at ognl.ASTChain.getValueBody(ASTChain.java:141) 
     at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) 
     at ognl.SimpleNode.getValue(SimpleNode.java:258) 
     at ognl.Ognl.getValue(Ognl.java:494) 
     at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:217) 
     at com.opensymphony.xwork2.ognl.OgnlValueStack.getValue(OgnlValueStack.java:342) 
     at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:331) 
     at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:307) 
     at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:293) 
     at org.apache.struts2.components.Component.findValue(Component.java:382) 
     at org.apache.struts2.components.If.start(If.java:86) 
     at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:53) 
     at org.apache.jsp.WEB_002dINF.views.layouts.header_jsp._jspx_meth_s_if_0(org.apache.jsp.WEB_002dINF.views.layouts.header_jsp:252) 
     at org.apache.jsp.WEB_002dINF.views.layouts.header_jsp._jspService(org.apache.jsp.WEB_002dINF.views.layouts.header_jsp:97) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:192) 
     at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:1013) 
     at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:698) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:80) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:73) 
     at org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72) 
     at org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:88) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:283) 
     at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:140) 
     at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:117) 
     at org.apache.tiles.jsp.taglib.RenderTagSupport.execute(RenderTagSupport.java:154) 
     at org.apache.tiles.jsp.taglib.RoleSecurityTagSupport.doEndTag(RoleSecurityTagSupport.java:75) 
     at org.apache.tiles.jsp.taglib.ContainerTagSupport.doEndTag(ContainerTagSupport.java:80) 
     at org.apache.jsp.WEB_002dINF.views.layouts.bodyWithSidebar_jsp._jspx_meth_tiles_insertAttribute_0(org.apache.jsp.WEB_002dINF.views.layouts.bodyWithSidebar_jsp:121) 
     at org.apache.jsp.WEB_002dINF.views.layouts.bodyWithSidebar_jsp._jspService(org.apache.jsp.WEB_002dINF.views.layouts.bodyWithSidebar_jsp:58) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.servlet.Dispatcher.include(Dispatcher.java:192) 
     at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:1013) 
     at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:698) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:80) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:73) 
     at org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72) 
     at org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:88) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:606) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:280) 
     at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:140) 
     at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:117) 
     at org.apache.tiles.jsp.taglib.RenderTagSupport.execute(RenderTagSupport.java:154) 
     at org.apache.tiles.jsp.taglib.RoleSecurityTagSupport.doEndTag(RoleSecurityTagSupport.java:75) 
     at org.apache.tiles.jsp.taglib.ContainerTagSupport.doEndTag(ContainerTagSupport.java:80) 
     at org.apache.jsp.WEB_002dINF.views.layouts.main_jsp._jspx_meth_tiles_insertAttribute_0(org.apache.jsp.WEB_002dINF.views.layouts.main_jsp:473) 
     at org.apache.jsp.WEB_002dINF.views.layouts.main_jsp._jspService(org.apache.jsp.WEB_002dINF.views.layouts.main_jsp:157) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:389) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327) 
     at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 
     at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:198) 
     at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:179) 
     at org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72) 
     at org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:88) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:606) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:246) 
     at org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105) 
     at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) 
     at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277) 
     at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263) 
     at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) 
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
     at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
     at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) 
     at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
     at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378) 
     at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
     at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:278) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235) 
     at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 
     at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390) 
     at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
     at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
     at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
     at org.mortbay.jetty.Server.handle(Server.java:326) 
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:536) 
     at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:915) 
     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539) 
     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405) 
     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
     at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

leí en el FAQ primavera de Seguridad que el Controlador/Acción no es el mejor sitio para fijar métodos, pero el fracaso se describe en el FAQ es que el @Secured la anotación no funcionará, es decir, el método no estará asegurado.

En mi caso, obtengo un valor de valuación nulo incluso antes de llegar a ese método; execute() no está asegurado, solo editUser() y aún no se llamó.

Espero que alguien tenga la misma experiencia y haya encontrado una solución ... gracias.

Actualización: Me pregunto si esto ayudará: Spring Security - how I can enable Method Security annotations?

Mis clases de acción se extienden actualmente una clase BaseAction donde pongo funcionalidad común, aunque ..

+2

¿Estás diciendo que con ROLE_ADMIN funcionaba bien y ahora (con TEST_ADMIN) no? –

+3

¿Ha intentado eliminar la anotación o el filtro de seguridad para verificar que el problema realmente proviene del filtro Spring Security y no de otra cosa? Además, para aclarar, parece que la variable 'currentPage' es' null', no la 'ValueStack' en sí misma. Has publicado todo el código de la clase de acción, pero supongo que de hecho tienes un método 'getCurrentPage()'? – rees

+0

Realmente no sería honesto que Spring Security fallara con una NullPointerException si no podía encontrar un método getter para currentPage. Sería mejor que fallara con PropertyNotFound o algo así. Pero tampoco entiendo por qué concluiste que todo ValueStack es nulo. –

Respuesta

2

Me pregunto, este problema se produce si utilice la configuración predeterminada de Spring Security, donde espera ROLE_ nombres prefijados.

Ver esta pregunta: How do I use custom roles/authorities in Spring Security?

Está utilizando la configuración por defecto de brujas espera que los roles comienza con el prefijo "ROLE_".Usted tendrá que añadir una configuración de seguridad personalizada y establecer rolePrefix a ""

El ejemplo de configuración de: Spring Security Role Prefix and Custom User Details Service

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"> 
    <beans:property name="rolePrefix" value="" /> 
</beans:bean> 

preguntas relacionadas:

1

esto no responderá directamente a su pregunta, pero tendría un tiempo de integración mucho más fácil si utiliza los controladores Spring 3 MVC con anotaciones y utiliza una versión de Spring Security que coincida. Esto le daría la ventaja adicional de poder desarrollarlo más rápido, eliminar la configuración XML para sus controladores y solo tomaría unos minutos para cambiar. Dependiendo de qué tan avanzado esté en su implementación, esta puede ser una opción. Por lo general, las anotaciones de Spring solo funcionan cuando están dentro de un beans gestionados por Spring o teje dependencias en clases que no sean Spring en compilación o en tiempo de ejecución.

2

stacktrace indica un problema en el archivo 'header.jsp', donde hay un problema con la etiqueta. Sospecho que simplemente tiene un problema de nullpointer con la expresión en la etiqueta. ¿Puedes compartir el fragmento JSP de header.jsp?

1

Ya trabajé con un proyecto como este. Usé Struts 2, Spring 3.0.0 y Spring Security.

Creo que podrías tratar de anotar las acciones de struts con @ org.springframework.stereotype.Controller ... esta es la forma actual de administrar Spring tu acción Struts. Creo que solucionará el problema de seguridad primaveral con el que estaba relacionado.

Recuerdo otra particularidad acerca de esta arquitectura. En web.xml, debe establecer los oyentes y filtros de primavera antes de los filtros Struts 2. Encontré mi proyecto anterior y mi web.xml era así:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="starter" version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Onleague.com</display-name> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:META-INF/app-context.xml</param-value> 
    </context-param> 

    <!-- Spring --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener>  
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>openSessionInViewFilter</filter-name> 
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>openSessionInViewFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- Struts 2 --> 
    <filter> 
     <filter-name>action2-cleanup</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>action2-cleanup</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 
    <filter> 
     <filter-name>action2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>action2</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <!-- Sitemesh -->  
    <filter> 
     <filter-name>sitemesh</filter-name> 
     <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>sitemesh</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <!-- Servlets --> 
    <servlet> 
     <servlet-name>dwr</servlet-name> 
     <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 
     <init-param> 
      <param-name>debug</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </servlet> 
    <servlet> 
     <servlet-name>jspSupportServlet</servlet-name> 
     <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> 
     <load-on-startup>5</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dwr</servlet-name> 
     <url-pattern>/dwr/*</url-pattern> 
    </servlet-mapping> 


    <!-- Welcome file lists --> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
     <welcome-file>default.jsp</welcome-file> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

¡Buena suerte!

Cuestiones relacionadas