2013-03-25 8 views
5

मैं वाडिन के लिए नया हूं। इससे पहले मैंने एक जेएसएफ वेब एप्लीकेशन बनाया था। मेरे पास एक प्रबंधित बीन उपयोगकर्ता का लॉगिन कर रहा था। मैंने प्रमाण-पत्रों के वास्तविक सत्यापन का प्रतिनिधित्व करने के लिए सुरक्षा-क्षेत्र का उपयोग किया।वाडिन प्रमाणीकरण और औहोरिज़ेशन

मैं वाडिन में यह कैसे कर सकता हूं? क्या कोई सर्वोत्तम अभ्यास है? मैं एक बिंदु पर हूं जहां मैं कुछ एक साथ रखूंगा, लेकिन किसी प्रकार की मानक प्रक्रिया होनी चाहिए, है ना ?? मुझे इस पर कुछ ट्यूटोरियल मिले, लेकिन ज्यादातर स्प्रिंग का उपयोग (मैं ईजेबी का उपयोग करना चाहता हूं)। इसके अलावा, हर ट्यूटोरियल असीमित जटिल लग रहा था।

कुछ सामान्य के लिए कुछ सरल + निर्णायक ट्यूटोरियल होना चाहिए।

उत्तर

3

यहाँ का उपयोग कर रहा है कि कैसे एक सुरक्षित करने के लिए के बारे में केवल Vaadin आधिकारिक लेख है Vaadin aplication using JAAS जो मुझे मिल सकता था। मेरा मतलब मूल या आधिकारिक वादीन सिक्योरिज़ेशन है। यदि आप वसंत सुरक्षा, शिरो के साथ थोड़ी सी बात करते हैं, तो आपको और अधिक मिल जाएगा, लेकिन शुद्ध ईएसबी जेएएएस का उपयोग करता है। मैं मानता हूं कि यह आलेख यह जानने के लिए पर्याप्त नहीं है कि एप्लिकेशन कैसे सेट अप करें।

1. Vaadin CDI विस्तार: मैं यहाँ अपने अनुभव को साझा

<!-- Vaadin Official DI support. --> 
<dependency> 
    <groupId>com.vaadin</groupId> 
    <artifactId>vaadin-cdi</artifactId> 
    <version>1.0.0.alpha2</version> 
</dependency> 

2. JAAS

के बारे में समझना मैं सुझाव है कि आप देखने के लिए कैसे JAAS एक गैर में काम करता है vaadin आवेदन, अवलोकन लेख पढ़कर, क्योंकि जेएएएस सर्वर अनुप्रयोग प्रदाता (टॉमई, जेबॉस, वाइल्डफ्लाई, ग्लासफ़िश) पर निर्भर करता है, सभी में अलग-अलग कॉन्फ़िगरेशन सेटिंग्स होती हैं। यहां आपको टोमे का उपयोग करके proof of concept मिलेगा।

3. अपना खुद का लॉगिन मॉड्यूल विकसित करना।

आप उदाहरण के लिए एक कस्टम लॉगिन मॉड्यूल बनाने का फैसला किया है: META-INF/आपके आवेदन की context.xml में

public class MyLoginModule implements LoginModule { 
private CallbackHandler handler; 
private Subject subject; 
private UserPrincipal userPrincipal; 
private RolePrincipal rolePrincipal; 
private String login; 
private List<String> userGroups; 
@Override 
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, 
Map<String, ?> options) { 
handler = callbackHandler; 
this.subject = subject; 
} 
@Override 
public boolean login() throws LoginException { 
Callback[] callbacks = new Callback[2]; 
callbacks[0] = new NameCallback("login"); 
callbacks[1] = new PasswordCallback("password", true); 
try { 
handler.handle(callbacks); 
String name = ((NameCallback) callbacks[0]).getName(); 
String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword()); 
// Here we validate the credentials against some 
// authentication/authorization provider. 
// It can be a Database, an external LDAP, a Web Service, etc. 
// For this tutorial we are just checking if user is "user123" and 
// password is "pass123" 
if (name != null && name.equals("admin") && password != null && password.equals("admin")) { 
login = name; 
userGroups = new ArrayList<String>(); 
userGroups.add("admin"); 
return true; 
} 
// If credentials are NOT OK we throw a LoginException 
throw new LoginException("Authentication failed"); 
} catch (IOException e) { 
throw new LoginException(e.getMessage()); 
} catch (UnsupportedCallbackException e) { 
throw new LoginException(e.getMessage()); 
} 
} 
@Override 
public boolean commit() throws LoginException { 
userPrincipal = new UserPrincipal(login); 
subject.getPrincipals().add(userPrincipal); 
if (userGroups != null && userGroups.size() > 0) { 
for (String groupName : userGroups) { 
rolePrincipal = new RolePrincipal(groupName); 
subject.getPrincipals().add(rolePrincipal); 
} 
} 
return true; 
} 
@Override 
public boolean abort() throws LoginException { 
return false; 
} 
@Override 
public boolean logout() throws LoginException { 
subject.getPrincipals().remove(userPrincipal); 
subject.getPrincipals().remove(rolePrincipal); 
return true; 
} 
} 

संदर्भ यह। यह सेटिंग्स टॉमई के लिए हैं, लेकिन ग्लैशफ़िश या अन्य के लिए समान होना चाहिए।

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Realm className="org.apache.catalina.realm.JAASRealm" appName="myrealm" userClassNames="net.sf.jaas.auth.UserPrincipal" 
    roleClassNames="net.sf.jaas.auth.RolePrincipal" /> 
</Context> 

पता है कि userClassNames और roleClassNames केवल साधारण जावा POJO हैं, लेकिन java.security.Principal को लागू करना चाहिए रहें,

3. JAAS को सक्षम करने में अपने Vaadin लॉग देखें

अपने पसंदीदा लॉगिन फार्म, Vaadin TextField और पासवर्ड का उपयोग कर परिभाषित करें, और) अपने doLoginEvent में परिभाषित करते हैं (JAAS करने के लिए एक संदर्भ। जब भी JaasAccessControl.login कहा जाता है, तो आपके लॉगिन मॉड्यूल का एक नया उदाहरण बनाया जाएगा।

import com.vaadin.cdi.access.JaasAccessControl; 
    try { 
      JaasAccessControl.login(loginEvent.getUsername(), loginEvent.getPassword()); 
      logger.info("User {} authenticated", getPrincipalName()); 
      navigator.navigateTo(Main.NAME); 
     } catch (Exception e) { 
      Notification.show("Error logging in", Type.ERROR_MESSAGE); 
      logger.error(e.getMessage(), e); 
     } 

4. आपके लॉग किए गए उपयोगकर्ता की जानकारी का उपयोग करना।

जब भी कोई उपयोगकर्ता JAAS लॉगिन फ़िल्टर पास करता है। यह उनके अनुरोध संदर्भ में एक वर्ग है जो उसे पहचानता है। इस वर्ग को प्रिंसिपल कहा जाता है (जिसे आपने पहले लॉग इन मॉड्यूल क्लास में सेट किया था)।

public boolean isUserInRole(String role) { 
     return JaasAccessControl.getCurrentRequest().isUserInRole(role); 
    } 

    public String getPrincipalName() { 
     Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal(); 
     if (principal != null) { 
      return principal.getName(); 
     } 

     return null; 
    } 

    public boolean isUserSignedIn() { 
     Principal principal = JaasAccessControl.getCurrentRequest().getUserPrincipal(); 
     return principal != null; 
    } 

5. वैकल्पिक LoginModule को

यह अपने कस्टम लॉगिन मॉड्यूल बनाने के लिए, सामान्य रूप से Tomee के रूप में जावा ईई प्रदाताओं कुछ कार्यान्वयन की आपूर्ति अनिवार्य नहीं है। कुछ डेटाबेस टेबल में गुण फ़ाइल के आधार पर प्रमाणीकरण। Tomee documentation JAAS पर एक नजर डालें कुछ उदाहरण देखने के लिए:

6. TomEE में JAAS सक्षम करें तुम एक jaas.config फ़ाइल आप LoginModule का संदर्भ जो बनाने की आवश्यकता, उदाहरण के लिए: फिर शुरू

filename: jaas.config 
myrealm{ 
    net.sf.jaas.MyLoginModule required; 
}; 

इस पैरामीटर के साथ आवेदन सर्वर:

-Djava.security.auth.login.config=E:/apache-tomee-jaxrs-1.6.0.2/conf/jaas.config 

आप एक बार देख इस की अवधारणा का एक सबूत करना चाहते हैं। Checkout this example, जो Tomee, Vaadin 7, JAAS का उपयोग करता है,

1

मैं कुछ महीने पहले एक ही समस्या में भाग रहा था। मैं तो यह पता लगाने की कैसे यह वास्तव में काम करता है में सक्षम नहीं था, इसलिए मैं वसंत adddon पर पहुँच गईं और अब मैं एक Vaadin लॉगिन फार्म और वसंत सुरक्षा

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। हालांकि मैं इस सवाल को खुला छोड़ दूंगा, क्योंकि कोई शुद्ध वाडिन समाधान के साथ आ सकता है। – fancy

1

एक पूर्ण उदाहरण JAAS, Vaadin 8 का उपयोग करता है, Vaadin CDI ऐड-ऑन और निर्मित LoginForm उपलब्ध here है, कदम इस प्रकार हैं:

  1. Vaadin CDI सक्षम ऐड-ऑन pom.xml
  2. में @CDIUI टिप्पणी के साथ CDI in Vaadin UI सक्षम और कॉन्फ़िगर Navigator
  3. @RolesAllowed एनोटेशन जोड़कर authorization in a CDI view सक्षम करें (या किसी अन्य javax.annotation.security एनोटेशन)
  4. a login view लागू करें जो अंतर्निहित LoginForm से प्राप्त होता है और उपयोगकर्ता को प्रमाणीकृत करने के लिए JaasAccessControl का उपयोग करता है।

यह एक बार आप यह पता लगाने कैसे टुकड़ों को एक साथ फिट वास्तव में एक नहीं बल्कि अच्छा, धाराप्रवाह अनुभव है।

Vaadin wiki में एक लंबे लेख बताते हैं कि कैसे JAAS साथ डेटाबेस समर्थित प्रमाणीकरण का उपयोग करने के लिए नहीं है।

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