2011-06-22 28 views
5

Yay güvenliği ile Web uygulamamın parçalarını, https: security:intercept-url etiketi ile güven altına almam gerekiyor. ÖrneğinYay Güvenliği: https'yi bayrak ile zorlamak nasıl?

:

<security:intercept-url pattern="/**/*secure*" requires-channel="https"/> 
<security:intercept-url pattern="/**" requires-channel="http" />  

dosya adı veya https olsun düşük düzeyde "güvenli" içeren dizinleri "güvenli" olan tüm istekler, dinlenme http alacak Bu şekilde.

Spring force https yapmak için bir bayrak kullanmanın bir yolu var mı? "?" Den sonra işler alan hiçbir şey alamadım. bir URL’nin => Http

  • http://domain/abc => http
    • http://domain/abc?secure=true

    Bahar sonra şeffaf https://domain/abc?secure=true için http://domain/abc?secure=true olacak her talebi yönlendirmek olacaktır.

    Bunu başarmanın bir yolu var mı? Örnekteki ilk örnek, "?" Den önce bir "güvenli" sonuca ulaşır, ancak "?" Ifadesinden sonra bir bayrağa sahip bir çözüm/desen arıyorum. bir tek.

    +0

    Soruyu anlamıyorum. Bunu mu demek istediniz? Http: // domain/abc? Secure = true' kullanıcıyı 'https: // domain/abc' olarak yönlendirmeli mi? Yoksa "güvenli = true" istek parametresini içeren herhangi bir URL "HTTPS kullanmalıdır" demek istiyor musunuz? –

    +0

    Evet, http: // etki alanı/abc? Secure = true kullanıcıyı yönlendirmeli https: // etki alanı/abc? Güvenli = true – Ansgar

    cevap

    3

    "" URL'lerde, stripQueryStringFromUrls öğesi false değerine ayarlanmalıdır.

    Spring forum: : Bu BeanPost Processor yüklendiğinde, özellik ayarlanacaktır.

    public class BeanPostProcessorImpl implements BeanPostProcessor 
    { 
        final static private Logger log = Logger.getLogger(BeanPostProcessorImpl.class); 
    
        @Override 
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException 
        { 
         return bean; 
        } 
    
        @Override 
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException 
        { 
         if (bean instanceof DefaultFilterInvocationSecurityMetadataSource) 
         { 
          log.info("********* Post-processing " + beanName); 
          ((DefaultFilterInvocationSecurityMetadataSource) bean).setStripQueryStringFromUrls(false); 
         } 
         return bean; 
        } 
    } 
    

    desen

    <security:intercept-url pattern="/**/*?secure=true*" requires-channel="https"/> 
    

    nihayet çalışır Bu şekilde.

    +0

    Bir PostProcessor'dan ziyade setStripQueryStringFromUrls (false) ayarını sadece bahar bağlamında ayarlayabilirsiniz. Bu şekilde kod yazman gerekmeyecek. – Simeon

    +0

    Ben de sevmiyorum. Mülkiyeti bağlam yoluyla kurmanın bir yolunu bulamadım. DefaultFilterInvocationSecurityMetadataSource veya FilterChainProxy üzerinde fasulye tanımları oluşturma, her türlü korkunç hataları yarattı. Bir BeanPostProcessor kullanarak bir fasulye bahar yaratır bir özellik ayarlamak için bulduğum tek yol oldu. – Ansgar

    +0

    Hmm, Tamam, FilterChainProxy'yi yalnızca getStripQueryStringFromUrls() işlevini geçersiz kılabilirsiniz, her zaman false değerini döndürür ve FilterChainProxy'nizi varsayılan yerine web.xml dosyasında kullanabilirsiniz. Bundan daha iyi olsa da emin değilim ... – Simeon

    2

    Size, baharı bir https kanalına yönlendirmek için söyleyeceğiniz bir URL parametresi olmasını istediğinizi söyleyebilirim.

    Yani denedin mi: ''

    <security:intercept-url pattern="/**/*?secure*" requires-channel="https"/> 
    

    veya bu işe yaramazsa kaçan bir deneyin :

    <security:intercept-url pattern="/**/*\?secure*" requires-channel="https"/> 
    

    Sadece (3.0.5.RELEASE olarak) FilterChainProxy için kaynak bir göz vardı ve desenleri maç için normal ifadeleri kullanır.

    org.springframework.security.web.util.RegexUrlPathMatcher#pathMatchesUrl(Object compiledPath, String url)

    veya

    org.springframework.security.web.FilterChainProxy#getFilters(String url)

    tam olarak neye ihtiyacınız desen görmek için: Yani bir göz olabilir.

    Şu anda yayın şu anda '?' Desteklemiyorsa bile Kendi UrlPathMatcher'nu uzatabilir ve FilterChainProxy içine enjekte edebilirsiniz.

    +0

    Belirtilen getFilters yöntemine baktığınızda, "?" Nin arkasındaki her şeyi görürsünüz. Hangi filtreyi kullanıyor olursanız olun, yine de soyulacaktır. Solutation sonra stripQueryStringFromUrls yanlış olarak ayarlanır. İşaretçi için teşekkürler. – Ansgar

    İlgili konular