2015-06-02 46 views
0

當Web會話過期時,Spring Security以403 HTTP狀態響應。理想情況下,它會以401響應。未授權和禁止是不同的。如果有有效的會話,對受保護資源的請求只應返回403,但用戶只是沒有權限訪問該資源。如果資源是安全的並且沒有經過驗證的會話,那麼Spring Security應該返回一個401.我的應用程序需要非常具體地區分這兩個錯誤代碼。Spring Security Plugin應該使用401而不是403來響應

我的問題是,我如何定製這種行爲?關於401和403之間差異的論點,請參考read this

+0

查看源代碼,它似乎並不可定製:https://github.com/grails-plugins/grails-spring-security-core /blob/144b235e1c45e3de7178089e7be0b478d0ce512c/src/java/grails/plugin/springsecurity/web/access/AjaxAwareAccessDeniedHandler.java –

+0

嗯,這是令人失望的。 – Gregg

+0

沒有什麼可以阻止你用你自己的實現這個特性的默認實現來代替它。可能還會提出一個很好的pull請求(: –

回答

0

這裏是我的這個解決方案:

@Configuration 
public class WebCtxConfig implements BeanPostProcessor { 

     @Override 
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
      if (bean instanceof SessionManagementFilter) { 
       SessionManagementFilter filter = (SessionManagementFilter) bean; 
       filter.setInvalidSessionStrategy(new InvalidSessionStrategy() { 

        @Override 
        public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
        } 
       }); 
      } 
      return bean; 
     } 

     @Override 
     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
      return bean; 
     } 
    } 
+0

)有趣的感謝你的回覆。在resources.groovy中我需要做些什麼來完成這個工作,或者'@ Configuration'和'BeanPostProcessor'子類是否需要我的 – Gregg

+0

這是行不通的,Spring Security仍然返回403. – Gregg

+0

你確定配置類包含在你的上下文配置中嗎?順便說一句,我正在使用Java,所以我不知道Groovy配置在Java中,您只需將其包含在您的上下文配置中。 – Modi

相關問題