2017-12-28 36 views
1

私はSpring SecurityでSpring MVC Webアプリケーションを実行しています。ここでリクエストメソッド 'POST'はセッションが終了してもサポートされません

をサポートしていません

リクエストメソッド「POST」はエラーログです:私はセッションは私が取得しています(POSTで)有効期限が切れた後/ページを更新するたびに提出します私がSpring SecurityでCSRFを無効にすると、正常に動作しています。ここで

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported 
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:204) 
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:382) 
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:322) 
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:60) 
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:351) 
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1120) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:932) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:467) 
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:392) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 
at org.springframework.security.web.firewall.RequestWrapper$FirewalledRequestAwareRequestDispatcher.forward(RequestWrapper.java:139) 
at org.springframework.security.web.access.AccessDeniedHandlerImpl.handle(AccessDeniedHandlerImpl.java:71) 
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:110) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:748) 

ここに私のSpring構成

http 
    .authorizeRequests() 
     .antMatchers("/login**").permitAll() 
     .antMatchers("/help**").permitAll() 
     .antMatchers("/faq/**").permitAll() 
     .antMatchers("/denied").permitAll() 
     .antMatchers("/checkSSO").permitAll() 
     .antMatchers("/product/lease/list").permitAll() 
     .antMatchers("/request/lease/product/list").permitAll() 
     .antMatchers("/product/view/**").permitAll() 
     .antMatchers("/product/image/**").permitAll() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     // .antMatchers("/db/**").access("hasRole('ROLE_ADMIN') and hasRole('DBA')") 
     .anyRequest().authenticated() 
     .and() 
    .formLogin() 
     .loginPage("/login") 
     .successHandler(customSuccessHandler()) 
     .and() 
    .logout() 
     .logoutUrl("/login?logout") 
     .invalidateHttpSession(true).deleteCookies("JSESSIONID") 
     .and() 
    .exceptionHandling() 
     .accessDeniedPage("/denied") 
     .and() 
    .exceptionHandling() 
     .authenticationEntryPoint(ssoAuthenticationEntryPoint()) 
     .and() 
    .addFilterBefore(userNameTransformationFilter(), UsernamePasswordAuthenticationFilter.class) 
    .addFilterBefore(customPreAuthSecurityFilter(), BasicAuthenticationFilter.class) 
    .addFilterAfter(waffleNegotiateSecurityFilter(), BasicAuthenticationFilter.class) 
    .addFilterAfter(customNegotiateSecurityFilter(), BasicAuthenticationFilter.class) 
    .authorizeRequests() 
     .anyRequest().fullyAuthenticated(); 

は、認証エントリポイントJavaクラスは、任意の提案

public class SSOAuthenticationEntryPoint extends NegotiateSecurityFilterEntryPoint { 

    private static final Logger logger = Logger.getLogger(SSOAuthenticationEntryPoint.class); 

    /* 
    * (non-Javadoc) 
    * @see org.springframework.security.web.AuthenticationEntryPoint#commence(javax.servlet.http.HttpServletRequest, 
    * javax.servlet.http.HttpServletResponse, org.springframework.security.core.AuthenticationException) 
    */ 
    @Override 
    public void commence(final HttpServletRequest request, final HttpServletResponse response, 
         final AuthenticationException ex) throws IOException, ServletException { 
     String ctxPath = ((HttpServletRequest) request).getContextPath(); 
     String requestURI = request.getRequestURI(); 
     logger.info(" start authentication process - " + requestURI); 
     if (("" + ctxPath + "/rest/sso").equalsIgnoreCase(requestURI)) { 
      super.commence(request, response, ex); 
     } else { 
      Boolean hasCheckedSSO = (Boolean) request.getSession().getAttribute(SecurityConstants.ATTR_HAS_CHECKED_SSO); 
      Boolean ssoUserNotFound = (Boolean) request.getSession().getAttribute(SecurityConstants.ATTR_SSO_USER_NOT_FOUND); 
      logger.info("hasCheckedSSO = " + hasCheckedSSO + ", ssoUserNotFound = " + ssoUserNotFound); 
      String target = request.getRequestURI() + (request.getQueryString() != null ? "?" + request.getQueryString() : ""); 
      request.getSession().setAttribute(SecurityConstants.ATTR_TARGET, target); 
      if (ssoUserNotFound != null && ssoUserNotFound) { 
       response.sendRedirect(ctxPath + "/login?noaccess"); 
      } else if (hasCheckedSSO == null) { 
       request.getSession().setAttribute("hasCheckedSSO", Boolean.TRUE); 
       target = URLEncoder.encode(target, "UTF-8"); 
       response.sendRedirect(ctxPath + "/checkSSO?target=" + target); 
      } else { 
       response.sendRedirect(ctxPath + "/login"); 
      } 
     } 

    } 
} 

お願いしていますか?

+0

はい、私はGETメソッドを持つコントローラを持っています。 – Rajesh

答えて

1

セッションが期限切れの場合、リクエストに有効でないCSRFトークンが含まれているか、またはCSRFトークンがまったく含まれていないため、アクセスが拒否されます。なし(

ショートカットを使用するAccessDeniedHandler指定するには、特定のエラー・ページ

このベースAccessDeniedHandler前方には、次のとおりです。

あなたは、 ExceptionHandlingConfigurer#accessDeniedPage参照 AccessDeniedHandlerを作成し、アクセス拒否のページを、設定されアクセスを拒否したページへのリクエストをリダイレクトします。 AccessDeniedHandlerImpl

この実装は、403(SC_FORBIDDEN)HTTPエラーコードを送信します。さらに、errorPageが定義されている場合、実装は指定されたエラーページビューに要求ディスパッチャを「転送」します。 「前向き」であるため、SecurityContextHolderは入力されたままです。これは、ビュー(またはタグライブラリまたはマクロ)がSecurityContextHolderにアクセスしたい場合に便利です。要求スコープには、キーWebAttributes.ACCESS_DENIED_403から利用可能な例外自体も入力されます。

だから、あなただけでなく、HTTP GETPOST、他のすべての使用されるHTTPメソッドをサポートするアクセス拒否のページを必要としています。

関連する問題