2011-11-03 18 views
6

今、ロードバランサはhttpsを処理し、そのhttpsをWebサーバーに渡します。そのため、各リクエストに対してhttps doubleを処理します。私がやりたいことは、httpsを完全にオフロードすることで、私のWebサーバーはそれに対処する必要がありません。Springセキュリティでロードバランサにhttpsをオフロード

Webサーバーがすべての要求がhttpと考えると、Spring SecurityとJSPページをどのように設定すればよいですか?明らかに私の設定の<intercept-url>要素を変更して、requires-channel属性を常にhttpまたはanyにする必要があります。私のJSPページでは、${secureUrl}${nonSecureUrl}というリンクを<c:url value=''/>の先頭に追加する必要があります。結果のページがhttpsまたはhttpである必要があるかどうかによって異なります。コントローラーからのリダイレクトは、このように変更する必要があります...他に何か?

JSPページ内のすべてのリンクを変更してスキームとホストを含​​めるのはかなり苦しいようです。それを行う良い方法はありますか?

答えて

6

ロードバランサでSSLを終了する場合、ロードバランサは最初に要求されたプロトコルを示すヘッダーを送信する必要があります。たとえば、F5はX-Forwarded-Protoを追加します。

ここから、request.isSecure()の代わりにこのヘッダーを見るカスタムChannelProcessorを作成できます。その後、<intercept-url requires-channel="https">と相対<c:url>を引き続き使用できます。

手順:decide()をオーバーライド

  1. サブクラスSecureChannelProcessorInsecureChannelProcessordecide()で、ロードバランサが送信したヘッダーを確認します。

    @Override 
    public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException { 
    
        for (ConfigAttribute attribute : config) { 
         if (supports(attribute)) { 
          if (invocation.getHttpRequest(). 
            getHeader("X-Forwarded-Proto").equals("http")) { 
           entryPoint.commence(invocation.getRequest(), 
            invocation.getResponse()); 
          } 
         } 
        } 
    } 
    
  2. 次にBeanPostProcessorを用いChannelDecisionManagerImpl豆にこれらChannelProcessorsを設定します。このためにBeanPostProcessorを使用する理由/方法については、Spring Security FAQを参照してください。

+0

は、上記の手順を試してみました、決定方法が呼び出されていない場合は、設定する必要がありますか? –

1

これはセキュリティプラグインの一部としてサポートされているようです。 http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/17%20Channel%20Security.htmlのボトムセクションをチェックして、LBが設定する要求ヘッダーのチェックについて説明します。

@Component 
public class SecureChannelProcessorHack extends SecureChannelProcessor { 

@Override 
public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException { 
    for (ConfigAttribute attribute : config) { 
     if (supports(attribute)) { 
      if ("http".equals(invocation.getHttpRequest().getHeader("X-Forwarded-Proto"))) { 
       getEntryPoint().commence(invocation.getRequest(), 
         invocation.getResponse()); 
      } 
     } 
    } 
} 
} 



@Component 
public class InsecureChannelProcessorHack extends InsecureChannelProcessor { 

@Override 
public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException { 
    for (ConfigAttribute attribute : config) { 
     if (supports(attribute)) { 
      if ("https".equals(invocation.getHttpRequest().getHeader("X-Forwarded-Proto"))) { 
       getEntryPoint().commence(invocation.getRequest(), 
         invocation.getResponse()); 
      } 
     } 
    } 
} 
} 

ステップ2:ステップ1の場合

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 
grails.plugins.springsecurity.secureChannel.secureHeaderName = '...' 
grails.plugins.springsecurity.secureChannel.secureHeaderValue = '...' 
grails.plugins.springsecurity.secureChannel.insecureHeaderName = '...' 
grails.plugins.springsecurity.secureChannel.insecureHeaderValue = '...' 
2

は素晴らしいsourcedelicaの答えを完了するために、ここでは完全なコードです

@Configuration 
public class LoadBalancerHack implements BeanPostProcessor { 

@Inject 
SecureChannelProcessorHack secureChannelProcessorHack; 

@Inject 
InsecureChannelProcessorHack insecureChannelProcessorHack; 

@Value("${behind.loadbalancer?false}") 
boolean behindLoadBalancer; 

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

@Override 
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
    if (behindLoadBalancer && bean instanceof ChannelDecisionManagerImpl) { 
     System.out.println("********* Post-processing " + beanName); 
     ((ChannelDecisionManagerImpl) bean).setChannelProcessors(newArrayList(
       insecureChannelProcessorHack, 
       secureChannelProcessorHack 
     )); 
    } 
    return bean; 
} 

} 
関連する問題