2012-12-07 32 views
6

क्या नीचे से फॉर्म आधारित प्रमाणीकरण प्रोग्रामेटिक रूप से जोड़ने का कोई तरीका है? मैं अपना खुद का LdapLoginModule उपयोग कर रहा हूं। प्रारंभ में मैं मूल प्रमाणीकरण का उपयोग करता हूं और यह ठीक काम करता है, लेकिन अब मुझे लॉगिन पेज (जैसे डिस्प्ले लोगो, आदि) पर अधिक नियंत्रण चाहिएएंबेडेड जेटी - प्रोग्रामेटिक रूप से फॉर्म आधारित प्रमाणीकरण जोड़ें

क्या कोई अच्छा नमूना है?

मैं एम्बेडेड जेट्टी v8.1.7 का उपयोग कर रहा हूं। मैं एम्बेडेड जेटी के लिए किसी भी web.xml का उपयोग नहीं करता हूं। जेटी सर्वर प्रोग्रामेटिक रूप से शुरू किया गया है।

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>Test JAAS Realm</realm-name> 
    <form-login-config> 
     <form-login-page>/login.html</form-login-page> 
     <form-error-page>/error.jsp</form-error-page> 
    </form-login-config> 
</login-config> 

उत्तर

11

एक FormAuthenticator बनाएँ और ServletContextHandler के लिए अपने SecurityHandler पर इस निर्धारित किया है। यह कोड 2 सर्वलेट्स के साथ एक छोटा सर्वर बनाता है। पहला सर्वलेट प्रमाणीकृत उपयोगकर्ता नाम के लिए हैलो मैसेज के साथ प्रतिक्रिया करता है। दूसरा सर्वलेट एक मामूली लॉगिन फॉर्म लागू करता है।

आप एक main[] में पेस्ट करते और चलाने के लिए सक्षम होना चाहिए (यदि आप अपने classpath में निम्नलिखित जार की आवश्यकता होगी; jetty-server, jetty-servlet और jetty-security)। परीक्षण करने के लिए, http://localhost:8080 पर ब्राउज़र को इंगित करें, आपको hello username की प्रतिक्रिया देखने से पहले प्रमाण-पत्र (उपयोगकर्ता नाम/पासवर्ड) के लिए संकेत दिया जाना चाहिए।

Server server = new Server(8080); 
ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("hello " + request.getUserPrincipal().getName()); 
    } 
}), "/*"); 

context.addServlet(new ServletHolder(new DefaultServlet() { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().append("<html><form method='POST' action='/j_security_check'>" 
     + "<input type='text' name='j_username'/>" 
     + "<input type='password' name='j_password'/>" 
     + "<input type='submit' value='Login'/></form></html>"); 
    } 
}), "/login"); 

Constraint constraint = new Constraint(); 
constraint.setName(Constraint.__FORM_AUTH); 
constraint.setRoles(new String[]{"user","admin","moderator"}); 
constraint.setAuthenticate(true); 

ConstraintMapping constraintMapping = new ConstraintMapping(); 
constraintMapping.setConstraint(constraint); 
constraintMapping.setPathSpec("/*"); 

ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); 
securityHandler.addConstraintMapping(constraintMapping); 
HashLoginService loginService = new HashLoginService(); 
loginService.putUser("username", new Password("password"), new String[] {"user"}); 
securityHandler.setLoginService(loginService); 

FormAuthenticator authenticator = new FormAuthenticator("/login", "/login", false); 
securityHandler.setAuthenticator(authenticator); 

context.setSecurityHandler(securityHandler); 

server.start(); 
server.join(); 
+0

इसे काम करने के लिए प्रबंधित नहीं किया गया ... – oshai

+0

धन्यवाद! यह मेरे लिए सहायक था, और मैं इसे काम करने में सक्षम था। – mwhidden

+2

यह सहायक है, लेकिन मैं सोच रहा हूं कि आप इसे कैसे करना जानते थे। जेटी दस्तावेज ... कठोर, अस्पष्ट होने के बिना है। उदाहरण के लिए 'ConstraintMapping' पूरी तरह से अनियंत्रित है और Google इसके बारे में कोई जानकारी प्रदान नहीं करता है। क्या आपको इसे जानने के लिए आंतरिक जेटी कोड पढ़ना है? – Timmmm