2012-03-28 15 views
7

मेरे पास वसंत सुरक्षा स्थापित है और अच्छी तरह से काम कर रहा है - यह वर्तमान में www.exampledomain.com से बाहर चल रहा है।जावा वसंत सुरक्षा - विभिन्न लॉगिन के लिए सबडोमेन यूआरएल अवरोध?

अब मैं सबडोमेन से बाहर निकलने वाले एप्लिकेशन का विस्तार करना चाहता हूं। उदाहरण के लिए newapp.exampledomain.com

केवल समस्या यह है कि इस नए एप्लिकेशन के लिए एक उपयोगकर्ता में लॉग इन करने की जरूरत है। वसंत ऋतु में यह माध्यम से <intercept-url pattern="/Admin/*" access="ROLE_GENERAL"/>

यूआरएल रोकना बहुत आसान है, लेकिन तुम क्या करते हो जब आप प्रवेश के लिए एक उप डोमेन रोकना चाहते हैं? उदाहरण के लिए निम्नलिखित मेरे लिए काम नहीं करता है:

<intercept-url pattern="http://newapp.exampledomain.com/*" access="ROLE_GENERAL"/> 

इस बारे में कोई विचार कैसे है?

+0

आप एक अलग webapp उप डोमेन में एक ही webapp का उपयोग कर रहे, है ना? – Qwerky

+0

आप सबडोमेन चेक जोड़ने के लिए 'फ़िल्टरसेक्योरिटीइंटरसेप्टर 'को ओवरराइट कर सकते हैं, लेकिन यह एक असली समाधान नहीं, एक हैक की तरह गंध करता है। आउट-ऑफ-द-बॉक्स समाधान के लिए अपने प्रश्न को ऊपर उठाएं। साथ ही, क्या आप वेब-ऐप/वेब-कंटेनर सबडोमेन कॉन्फ़िगरेशन के बारे में कुछ और विशिष्ट हो सकते हैं। – alexkasko

+0

ये विभिन्न उप डोमेन के लिए एक ही ऐप का उपयोग करते हुए, विभिन्न उप डोमेन उपयोगकर्ता को अलग-अलग कार्यक्षमता का प्रतिनिधित्व करते हैं लेकिन एक ही सर्वर इसे संभालता है (लागत प्रभावीता कारणों के लिए)। वेब ऐप कंटेनर सबडोमेन कॉन्फ़िगरेशन के लिए, उप-डोमेन को खोजने के लिए एक फ़िल्टर मौजूद है और फिर अनुरोध उस डोमेन funtionality के लिए प्रासंगिक कार्रवाई पर अग्रेषित किया जाता है। कल्पना करें .domain.com जो सभी पहुंच सकते हैं और pro.domain.com जो अतिरिक्त कार्यक्षमता के साथ एक बेहतर दिखता है और महसूस करता है। –

उत्तर

2

एक विकल्प आपके स्वयं के AccessDecisionVoter को लिखना होगा जो RoleVoter बढ़ाता है और होस्टनाम के आधार पर एक अतिरिक्त जांच जोड़ता है। कुछ इस तरह:

public class MyVoter extends RoleVoter { 
    public int vote(Authentication authentication, 
       java.lang.Object object, 
       java.util.Collection<ConfigAttribute> attributes) { 
    FilterInvocation filterInvocation = (FilterInvocation) object; 
    HttpRequest request = filterInvocation.getHttpRequest(); 
    // get subdomain from request 
    String subdomain = getSubdomain(request); 
    if ("free".equals(subdomain)) { 
     return ACCESS_GRANTED; 
    } 
    else { 
     super.vote(authentication, object, attributes); 
    } 
    } 
} 

फिर अपने मतदाता ऊपर तार:

<security:http auto-config="true" 
       use-expressions="true" 
       access-decision-manager-ref="accessDecisionManager"> 
... 
</security:http> 

<bean id="accessDecisionManager" 
     class="org.springframework.security.access.vote.UnanimousBased"> 
    <property name="decisionVoters"> 
     <list> 
      <bean class="com.acme.MyVoter" /> 
     </list> 
    </property> 
</bean> 

आप इसे एक कदम और आगे ले जाने की आप भी लिख सकता है चाहता है तो अपने स्वयं के configuration attributes जो आप में हार्डकोडेड होस्ट नाम चेकों को दूर की अनुमति होगी मतदाता और कुछ ऐसा करें:

<intercept-url pattern="/Admin/*" access="ROLE_GENERAL" domain="free.acme.com" /> 
+0

इंटरसेप्ट-यूआरएल टैग को किसी भी वसंत-सुरक्षा संस्करण में "डोमेन" नामक एक विशेषता नहीं मिलती है। मतदाता का उपयोग करना सच हो सकता है, लेकिन यह समाधान कभी काम नहीं करेगा। – tugcem

1

अपने सत्र कुकी में, डोमेन को स्पष्ट रूप से exampledomain.com पर सेट किया जाना चाहिए।

एप्लिकेशन सर्वर सत्र कुकी निर्माण (JSESSIONID) के लिए ज़िम्मेदार है लेकिन वसंत सुरक्षा नहीं है।

आपको बस इतना करना है कि आप अपने ऐप सर्वर को सूचित करें कि आप हमेशा कुकी में एक ही डोमेन रखना चाहते हैं।

अपने web.xml में जोड़ें:

<session-config> 
     <cookie-config> 
      <domain>exampledomain.com</domain> 
     </cookie-config> 
    </session-config> 
संबंधित मुद्दे