2012-10-25 12 views
5

मैं जेएएएस का अध्ययन कर रहा हूं और मैं एक जैसरेम के साथ टॉमकैट का उपयोग करके वेबपैप में उपयोग करने के लिए एक साधारण उदाहरण लागू कर रहा हूं।टोमकैट-जास - विषय कैसे प्राप्त करें?

अब मेरी समस्या यह है कि मुझे नहीं पता कि इस विषय को कैसे पुनर्प्राप्त करना है क्योंकि Subject subject = Subject.getSubject(AccessController.getContext()); जैसे कोड हमेशा शून्य हो जाते हैं।

मैं टॉमकैट 7.0.27 का उपयोग कर रहा हूं। क्या मुझे कुछ याद आया है? अन्य शर्तों में मैं Java EE में JAAS के साथ प्राधिकरण का प्रबंधन कैसे कर सकता हूं? उदाहरण के लिए मैं जेएएएस के सुरक्षित संदर्भ में एक क्रिया कैसे कार्यान्वित कर सकता हूं?

+0

सुनिश्चित करें कि आपके दायरे अपने webapp के लिए प्रयोग किया जाता है हो सकता है, तो आप कोशिश कर सकते हैं सर्वलेट्स एपीआई 'HttpServletRequest.getUserPrincipal()' –

+0

मैं जानता था और यह काम करता है, लेकिन मैं भी roleprincipal पाने के लिए – sasaman85

उत्तर

8

मैं जानता था और यह काम करता है, लेकिन मैं भी roleprincipal प्राप्त करने के लिए विषय को पुनः प्राप्त करने

दुर्भाग्य से, यह है कि जावा ईई में की तरह काम नहीं करता है की जरूरत है। जेएएएस विषय सिर्फ "प्रधानाचार्यों का थैला" है, और उनमें से कौन सा उपयोगकर्ता/कॉलर प्रिंसिपल और/या भूमिका प्रिंसिपल का प्रतिनिधित्व करता है, बस मानक नहीं है। हर दूसरे कंटेनर चीजें अलग-अलग करता है। Javadoc for Tomcat's JAASRealm इस वर्णन करता है और बिलाव विशिष्ट सम्मेलन (जोर मेरा) बताते हैं:

JAAS विशिष्टता एक javax.security.auth.Subject उदाहरण के रूप में एक सफल प्रवेश, जो शून्य या अधिक शामिल कर सकते हैं का परिणाम का वर्णन करता है java.security.Subject.getPrincipals() विधि के वापसी मूल्य में प्रिंसिपल ऑब्जेक्ट्स। हालांकि, यह कोई मार्गदर्शन पर कैसे प्रधानाध्यापकों कि अलग-अलग उपयोगकर्ता का वर्णन (और इस प्रकार एक वेब अनुप्रयोग में request.getUserPrincipal() के मूल्य के रूप में वापस जाने के लिए उपयुक्त हैं) प्रधान (रों) से अलग करने के प्रावधान है कि इस उपयोगकर्ता के लिए अधिकृत भूमिकाओं का वर्णन करें। अंतर्निहित LoginMethod कार्यान्वयन JAAS द्वारा निष्पादित से जितना संभव हो उतना स्वतंत्रता को बनाए रखने के लिए, निम्न नीति इस क्षेत्र से कार्यान्वित किया जाता है: [...]

कि इसके अलावा, एक जावा ईई वातावरण से आप शायद ही कभी भी जेएएएस विषय तक पहुंच है, अक्सर विक्रेता विशिष्ट तरीकों के माध्यम से भी नहीं। जेएएएस सार्वभौमिक मानक से बहुत दूर है जो आपको लगता है कि यह विशेष रूप से जावा ईई से संबंधित है।

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

उदाहरण के लिए जेबॉस एएस, इस प्रिंसिपल को अपनी कक्षाओं का उपयोग करके दो बार प्रतिलिपि बनाता है। इसलिए, यदि आपके जेएएएस मॉड्यूल ने उपयोगकर्ता/कॉलर प्रिंसिपल के लिए विषय में kaz.zak.FooPrincipal संग्रहीत किया है, तो HttpServletRequest#getUserPrincipal()org.jboss.security.SimplePrincipal वापस कर सकता है। गारंटी की एकमात्र चीज यह है कि उस उदाहरण पर getName() उसी स्ट्रिंग को वापस कर देगा।

इस विषय पर कुछ और पृष्ठभूमि के लिए

:

पिछले स्रोत मूल रूप से एक ही बात, विभिन्न शब्दों में कहते हैं;

हालांकि यह एक प्रमाणीकरण तंत्र (JAASRealm) के रूप में बिलाव के भीतर JAAS उपयोग करना संभव है, JAAS ढांचे के लचीलेपन खो दिया एक बार उपयोगकर्ता को प्रमाणीकृत किया जाता है। ऐसा इसलिए है क्योंकि प्रिंसिपल "उपयोगकर्ता" और "भूमिका" की अवधारणाओं को दर्शाने के लिए उपयोग किए जाते हैं, और अब वेबपृष्ठ निष्पादित किए गए सुरक्षा संदर्भ में उपलब्ध नहीं हैं। प्रमाणीकरण का परिणाम केवल request.getRemoteUser() और request.isUserInRole() के माध्यम से उपलब्ध है।

यह प्राधिकरण उद्देश्यों के लिए जेएएएस ढांचे को सरल उपयोगकर्ता/भूमिका प्रणाली के लिए कम करता है जो जावा सुरक्षा नीति के साथ अपना कनेक्शन खो देता है।

+0

धन्यवाद विषय को पुनः प्राप्त करने की जरूरत है , लेकिन मुझे समझ में नहीं आता कि जाम प्राधिकरण को टोमकैट (डोस इत्यादि का उपयोग) के साथ कैसे कनेक्ट करें – sasaman85

+0

आम तौर पर आप एक कंटेनर विशिष्ट लॉगिन मॉड्यूल लिखेंगे, जो जेएएएस या जो भी तकनीक आप चाहते हैं उसे लेता है और कंटेनर के अनुबंध को पूरा करता है। जब आप प्रोग्रामेटिक रूप से लॉगिन करते हैं (HttpServletRequest # लॉगिन) या संरक्षित संसाधन तक पहुंचें, तो प्रमाणीकरण किया जाएगा और कंटेनर इसके बारे में अवगत होगा। Web.xml () में बाधाओं के माध्यम से वेब पेज जैसे संसाधन सुरक्षित हैं। प्रमाणीकृत उपयोगकर्ता की भूमिकाओं के लिए अनुरोधित भूमिकाओं की तुलना करके प्रमाणीकरण होता है। यदि मैच, उपयोगकर्ता अधिकृत है। –

+0

पी। टॉमकैट का जेएएसआरईएलएएम जैस्पीक का प्रोटोटाइप है। मुझे इसका अनुभव नहीं है, लेकिन ऐसा लगता है कि सर्वलेट प्रोफाइल और ब्रिज प्रोफाइल के बीच एक क्रॉस है। –

0

विषय पुनर्प्राप्त करने के लिए हम LoginModule और वाल्व के संयोजन का उपयोग कर सकते हैं। तथ्य यह है कि प्रमाणन से पहले वाल्वों को बुलाया जाता है, यहां हमें मदद मिल रही है। जब वाल्व का आह्वान किया जाता है तो यह सत्र थ्रेडलोकल में रखता है (इसी प्रकार जेबीओएसएस थ्रेडलोकल में अनुरोध कैसे सहेजता है) और बाद में जब LoginModule.commit() का आह्वान किया जाता है तो यह सत्र को सत्र में सहेजता है।

एक जार करने के लिए नीचे दिए गए इस ऐड वर्ग के लिए संकलित कोड कॉन्फ़िगर और $ CATALINA_BASE/lib/

package my.test; 

import java.io.IOException; 
import java.util.Map; 

import javax.security.auth.Subject; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.login.LoginException; 
import javax.security.auth.spi.LoginModule; 
import javax.servlet.ServletException; 

import org.apache.catalina.Session; 
import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 
import org.apache.catalina.valves.ValveBase; 

/** 
* Use following class to retrieve subject in your HTTPServlet when using Tomcat. 
*/ 
public class ContainerServices extends ValveBase implements LoginModule { 

    // Key to revtieve subject from session. 
    public static final String SUBJECT_KEY = 
     "javax.security.auth.Subject.container"; 

    /** 
    * Session for current thread. 
    */ 
    static InheritableThreadLocal<Session> sessionHolder = 
     new InheritableThreadLocal<Session>(); 

    // JAAS Subject being authenticated. 
    private Subject subject; 

    // Invoke the value. 
    public void invoke(Request request, Response response) throws IOException, 
      ServletException { 

     sessionHolder.set(request.getSessionInternal(true)); 

     try { 
      // Next in the invocation chain 
      getNext().invoke(request, response); 
     } finally { 
      sessionHolder.remove(); 
     } 
    } 

    // Initialize the login module 
    public void initialize(Subject subject, CallbackHandler callbackHandler, 
     Map<String, ?> sharedState, Map<String, ?> options) { 
     this.subject = subject; 
    } 

    // Store subject to session. 
    public boolean commit() throws LoginException { 

     Session session = sessionHolder.get(); 

     if (session != null) { 
      session.getSession().setAttribute(ContainerServices.SUBJECT_KEY, subject); 
     } 

     return true; 
    } 

    // not used 
    public boolean abort() throws LoginException { 
     return false; 
    } 

    // not used 
    public boolean login() throws LoginException { 
     return true; 
    } 

    // not used 
    public boolean logout() throws LoginException { 
     return true; 
    } 
} 

के तहत यह जगह $ CATALINA_BASE में/conf/server.xml तत्व के बच्चे के रूप में वाल्व विन्यास निम्नलिखित को जोड़ने के लिए।

<Valve className="my.test.ContainerServices" /> 

jaas.config फ़ाइल में LoginModule के रूप में एक ही कक्षा में जोड़ें।

DummyAppLogin { 
    my.test.ContainerServices required debug=true; 
    my.test.DummyAppLoginModule required debug=true; 
}; 

अब आप लॉग इन के बाद, प्रमाणीकृत विषय निम्नलिखित का उपयोग कर प्राप्त किया जा सकता है।

session.getAttribute(ContainerServices.SUBJECT_KEY); 
संबंधित मुद्दे