2012-08-31 14 views
9

से रिमोट ईजेबी (आईआईओपी पर आरएमआई) को कॉल करते समय जेएएएस विषय को प्रचारित करने के लिए मैं JAAS Subject के प्रचार को custom Principal के साथ एक स्टैंडअलोन ईजेबी क्लाइंट से कच्चे जावा रनटाइम पर चलने वाले जावाई सर्वर पर चल रहा हूं। मैं जेबॉस और वेबस्पियर दोनों कार्यान्वयन को लक्षित कर रहा हूं।शुद्ध क्लाइंट

this forum thread के अनुसार मुझे उम्मीद है कि यह आसानी से जेबॉस के साथ काम करेगा।

Subject subject = new Subject(); 
Principal myPrincipal = new MyPrincipal("me I myself"); 
subject.getPrincipals().add(myPrincipal); 

PrivilegedExceptionAction<String> action = new PrivilegedExceptionAction<String>() { 
    public String run() throws Exception { 
      String result; 
      System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext())); 
      InitialContext ic = new InitialContext(); 
      Business1 b = (Business1) ic.lookup("StatelessBusiness1"); 
      result = b.getNewMessage("Hello World"); 
      return result; 
     } 
    }; 

result = subject.doAs(subject, action); 
System.out.println("result "+result); 

सर्वर साइड कोड है::

यहाँ मेरी EJB ग्राहक कोड कोड का टुकड़ा है

public String getNewMessage(String msg) { 
    System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal()); 
    System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext())); 
    return "getNewMessage: " + msg; 
} 

यह सुनिश्चित हो, तो भी यह डिफ़ॉल्ट व्यवहार है, मैं इस खंड को शामिल किया है

<security-identity> 
    <use-caller-identity/> 
</security-identity> 

मेरे सत्र सेम एक द्वारा संरक्षित नहीं है: मेरे ejb-jar.xml सत्र सेम करने के लिए वाई भूमिका।

this IBM WebSphere infocenter section के अनुसार, मैंने सिस्टम प्रॉपर्टी com.ibm.CSI.rmiOutboundPropagationEnabled=true को भी सक्षम किया है।

तकनीकी रूप से सेवा कॉल बोलने से या तो जेबॉस या वेबस्पियर पर ठीक से काम करता है। लेकिन क्लाइंट पर बनाए गए मेरे कस्टम प्रिंसिपल सहित जेएएएस विषय सर्वर पर प्रचारित नहीं है। या पाठ्यक्रम, Subject जेएनडीआई संदर्भ निर्माण से ठीक पहले डंप हो गया और ईजेबी कॉल ठीक है।

मैं सर्वर और ग्राहक (आईबीएम Java6 SR9 FP2 ...) के लिए एक ही जावा रनटाइम संस्करण चलाते हैं, MyPrincipal serializable वर्ग सर्वर क्लासपाथ (WebSphere के लिए AppServer/lib/ext, JBoss के लिए server/default/lib) में उपलब्ध है

WebSphere उदासीनता:

[8/31/12 11:56:26:514 CEST] 00000024 SystemOut  O getNewMessage principal: UNAUTHENTICATED 
[8/31/12 11:56:26:515 CEST] 00000024 SystemOut  O Current Subject: null 

JBoss उदासीनता:

12:30:20,540 INFO [STDOUT] getNewMessage principal: anonymous 
12:30:20,540 INFO [STDOUT] Current Subject: null 

यकीन के लिए, मैं जादू रों ​​किसी तरह चूक गए तितर। क्या आप जानते हैं कि कौन सा?

+0

तो: के रूप में मुझे याद है, websphere JAAS फोन करने वाले विषय का प्रचार नहीं करता है, इस

package foo.bar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.security.auth.Subject; import javax.security.auth.login.CredentialExpiredException; import org.apache.log4j.Logger; import com.ibm.websphere.security.WSSecurityException; import com.ibm.websphere.security.auth.CredentialDestroyedException; import com.ibm.websphere.security.auth.WSSubject; import com.ibm.websphere.security.cred.WSCredential; public class IdentityHelper { private static final Logger log = Logger.getLogger(IdentityHelper.class); private static final String CLASS_OBJECT = "java.util.HashMap"; private static final String KEY_OBJECT = "java.lang.String"; private static final String VALUE_OBJECT = "java.util.HashSet"; private Subject subject=null; private WSCredential creds; private Set publicCredentials=null; public IdentityHelper(Subject _subject) throws WSSecurityException { if(_subject==null) { IdentityHelper.log.warn("given subject was null, using Caller-Subject or the RunAs-Subject!"); this.subject = WSSubject.getCallerSubject(); if(this.subject==null)this.subject=WSSubject.getRunAsSubject(); } else { this.subject=_subject; } init(); } public IdentityHelper() throws WSSecurityException { this.subject=WSSubject.getRunAsSubject(); if(this.subject==null) { IdentityHelper.log.warn("using Caller-Subject NOT the RunAs-Subject!"); this.subject = WSSubject.getCallerSubject(); } init(); } private void init() throws WSSecurityException { Set<WSCredential> credSet= this.subject.getPublicCredentials(WSCredential.class); //set should contain exactly one WSCredential if(credSet.size() > 1) throw new WSSecurityException("Expected one WSCredential, found " + credSet.size()); if(credSet.isEmpty()) { throw new WSSecurityException("Found no credentials"); } Iterator<WSCredential> iter= credSet.iterator(); this.creds=(WSCredential) iter.next(); this.publicCredentials=this.subject.getPublicCredentials(); } public WSCredential getWSCredential() throws WSSecurityException { return this.creds; } public List<String> getGroups() throws WSSecurityException,CredentialDestroyedException,CredentialExpiredException { WSCredential c = this.getWSCredential(); return c.getGroupIds(); } /** * helper method for obtaining user attributes from Subject objects. * @param subject * @return */ @SuppressWarnings("unchecked") public Map<String, Set<String>> getAttributes() { Map<String, Set<String>> attributes = null; Iterator<?> i = this.subject.getPublicCredentials().iterator(); while (attributes == null && i.hasNext()) { Map<String, Set<String>> tmp = null; Object o = i.next(); if(IdentityHelper.log.isDebugEnabled()) { IdentityHelper.log.debug("checking for attributes (class name): " + o.getClass().getName()); } if(!o.getClass().getName().equals(CLASS_OBJECT)) continue;//loop through tmp = (Map) o; Object tObject = null; Iterator<?> t = null; t = tmp.keySet().iterator(); tObject = t.next(); if(IdentityHelper.log.isDebugEnabled()) { IdentityHelper.log.debug("checking for attributes (key object name): " + tObject.getClass().getName()); } if(!tObject.getClass().getName().equals(KEY_OBJECT)) continue;//loop through t = tmp.values().iterator(); tObject = t.next(); if(IdentityHelper.log.isDebugEnabled()) { IdentityHelper.log.debug("checking for attributes (value object name): " + tObject.getClass().getName()); } if(!tObject.getClass().getName().equals(VALUE_OBJECT)) continue;//loop through attributes = (Map) o; } if (attributes == null) { attributes = new HashMap<String, Set<String>>(); } return attributes; } public Subject getSubject() { return this.subject; } protected Set getPublicCredentials() { return publicCredentials; } } 

यह भी देखना आईबीएम

लिए विशिष्ट है? मैंने वेबस्पेयर और टिवोली पीडी प्रिंसिपल सपोर्ट के लिए पहले ही एक कस्टम लॉगिन मॉड्यूल सफलतापूर्वक लिखा है, मैंने HTTP पर केर्बेरोज एसपीएनईजीओ को सक्षम करने के लिए जेबॉस में लॉगिन मॉड्यूल कॉन्फ़िगर किया है ... निश्चित रूप से मैं जेएएएस और अन्य सामानों के साथ सहज हूं। मैं सिर्फ पूछता हूं कि क्या मैं गलत सोच रहा हूं कि यह काम करना चाहिए ... –

+1

को सत्यापित करने के लिए जेबॉस स्रोत कोड खोलने से पहले, तो आप मुझसे अधिक अनुभवी हैं;) (मैंने लॉगिन मॉड्यूल, कस्टम प्रमाणीकरण के साथ खेला, ग्लासफ़िश में आरएमआई-IIOP/CORBA पर प्रिंसिपल अग्रेषण 2.x, और यह हमेशा बहुत जटिल रहा है। आखिरकार, हमने इसे केवल एप्लिकेशन स्तर पर ही संभाला है) मैं उपयोगकर्ता नाम/पासवर्ड प्रमाणीकरण के लिए इन मानकों का उपयोग करके किसी भी रूप में फॉर्म को हतोत्साहित करता हूं। यदि बिंदु विरेट केर्बेरोज को एकीकृत करना है और एकल साइन-ऑन प्रदान करना है, तो यह अभी भी जाने का सबसे अच्छा तरीका हो सकता है! क्षमा करें, मैं और मदद नहीं कर सकता। – ewernli

+0

यदि तथ्य है, तो लक्ष्य हमारे विशिष्ट संदर्भ में वेबस्पियर के साथ केर्बेरोस का उपयोग करने में विफलता के आसपास काम करना है: http://stackoverflow.com/questions/10518057/how-to-enable-kerberos-authentication-for-remote-ejb- कॉल-ऑन-websphere –

उत्तर

3

मुझे संदेह है कि आपके पास WAS सर्वर पर सुरक्षा सक्षम नहीं है। चूंकि सुरक्षा सक्षम नहीं है और आपने WAS को प्रमाणित नहीं किया है, इसलिए कोई प्रमाण पत्र नहीं है। इस प्रकार getCallerPrincipal पर आपका कॉल संयुक्त राष्ट्र लौटा रहा है।

यदि आप था में आवेदन सुरक्षा चालू करने पर आप CSIv2 protocol के माध्यम से प्रमाणित करने के लिए होगा। एक स्टैंडअलोन क्लाइंट में अपना खुद का जेएएएस विषय बनाना इसे नहीं करेगा। यदि यह हो सकता है, तो कोई भी "हे, यह मैं हूं" प्रमाण पत्र बना सकता हूं और किसी भी दूरस्थ ईजेबी को लॉगिन करना चाहता हूं।

आपका कोड निष्पादन के चल रहे थ्रेड पर आपके विषय को संलग्न करके सर्वर पर काम करेगा। तार में बहने वाले विषयों/प्रमाण-पत्रों को विषय की जानकारी के क्रमिकरण को प्रभावित करने के लिए एक प्रोटोकॉल की आवश्यकता होती है और क्रेडेंशियल में पहचान का दावा करने वाले पार्टी का विश्वास सुनिश्चित होता है। एक स्टैंडअलोन क्लाइंट से, WAS उपयोगकर्ता प्रमाणीकरण, एलटीपीए और केर्बेरो के रूप में उपयोगकर्ता की जानकारी स्वीकार करता है। इसे व्यवस्थापक कंसोल के भीतर एक इनबाउंड CSIv2 कॉन्फ़िगरेशन पर कॉन्फ़िगर किया जा सकता है। यह पहले से संदर्भित जानकारी केंद्र लिंक में प्रलेखित है।

यह मजेदार सामान है। सौभाग्य।

+0

धन्यवाद और आप सही हैं, जेबॉस के लिए एक विशिष्ट लॉगिन मॉड्यूल आवश्यक है। वेबस्पेयर प्रचार के लिए सबसे आसान हिस्सा नहीं है, इसलिए मैं कस्टम लॉगिन मॉड्यूल के साथ ऑथ चेन को कस्टमाइज़ करने का निर्णय लेता हूं और फिर क्लाइंट JVM को com.ibm.CORBA.ConfigURL में sas.client.properties के साथ कॉन्फ़िगर किया जाना चाहिए। किसी भी मामले में, ईजेबी विधियों को सुरक्षित किया जाना चाहिए। –

0

शायद यह आपको मालिकाना वेबस्पेयर-कक्षाओं का उपयोग करने के लिए मूल्य के साथ मदद करेगा। Getting the caller subject from the thread for JAAS और Getting the RunAs subject from the thread

+0

मैंने वेबस्पेयर में काम करने के लिए "वैश्विक रूप से" सक्षम किया जाना चाहिए, और सुरक्षा सक्षम होने पर उपयोगकर्ताओं को प्रमाणित करने के बिना एसएसओ प्राप्त करने के लिए केर्बेरो प्रमाणीकरण की आवश्यकता हो सकती है। एक काम के रूप में, मैंने अपने स्वयं के संदर्भ के साथ आईआईओपी संदेशों को जोड़ने के लिए एक ओआरबी पोर्टेबलइंटरसेप्टर कार्यान्वयन तैयार किया है जहां मैंने उपयोगकर्ता का लॉगिन नाम संग्रहीत किया है। –

संबंधित मुद्दे