2010-04-27 14 views
8

के साथ स्वचालित पंजीकरण मैं ओपनआईडी लॉगिन और पंजीकरण के साथ वसंत सुरक्षा 3.0.2 का उपयोग कर एक ऐप लागू कर रहा हूं। मैं सफलतापूर्वक लॉगिन कर सकता हूं, लेकिन यदि उपयोगकर्ता पंजीकृत नहीं है तो मैं करना चाहता हूं:ओपनआईडी प्रमाणीकरण और स्प्रिंग सिक्योरिटी 3.0.2

1) कुछ ओपनआईड विशेषताओं जैसे ईमेल और नाम प्राप्त करें।
2) उपयोगकर्ता को केवल इन दो फ़ील्ड और ओपनआईडी यूआरआई भरने के साथ पंजीकरण फॉर्म दिखाएं।

मैं बहुत कुछ खोज रहा हूं लेकिन मुझे ऐसा करने का "शानदार" तरीका नहीं मिला। मुझे आश्चर्य है कि आप में से कुछ मेरे ऐप में इस रणनीति को लागू करने के समाधान के साथ बाहर आ सकते हैं।

अग्रिम धन्यवाद।

उत्तर

5

उपयोगकर्ता द्वारा पंजीकृत/लॉगिन करने से पहले आप ईमेल और नाम नहीं दिखा सकते हैं, क्योंकि उसे ऐप को पहले अपनी प्रोफ़ाइल तक पहुंचने की अनुमति देनी है। आप उसे अपने openid, मेल आदि के बाद वह में लॉग इन के साथ इस पेज को दिखा सकते हैं

को परिभाषित करें जो गुण आप उपयोग करना चाहते:।,

<openid-login login-page="/openidlogin.jsp" authentication-failure-url="/openidlogin.jsp?login_error=true"> 
    <attribute-exchange> 
    <openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" count="2"/> 
    <openid-attribute name="name" type="http://schema.openid.net/namePerson/friendly" /> 
    </attribute-exchange> 
</openid-login> 

और फिर गुण का उपयोग करने के बाद उपयोगकर्ता में लॉग इन किया है :

OpenIDAuthenticationToken token = (OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication(); 
List<OpenIDAttribute> attributes = token.getAttributes(); 

example from the spring repository पर एक नज़र डालें, और OpenId Support Documentation

+0

@dude:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <weaver options="-showWeaveInfo -verbose" /> <weaver> <include within="org.springframework.security.openid..*" /> <!-- This is required to make the spring instrument javaagent work with hibernate CGLIB --> <exclude within="*..*CGLIB*" /> </weaver> <aspects> <aspect name="org.acoveo.spring.utils.OpenIDSpringAuthenticationHackAspect" /> </aspects> </aspectj> 
फिर अपने UserDetailsService में

, तो आप इस प्रकार OpenID विशेषताओं का उपयोग कर सकते हैं : मुझे एक ही समस्या है और आपके द्वारा सुझाए गए उत्तर का उपयोग किया है ... लेकिन कोड काम नहीं कर रहा है .... http://stackoverflow.com/questions/7228733/openid-attribute-exchange-is पर एक नज़र डालें -not काम वसंत-securit y – aProgrammer

0

कि वसंत सुरक्षा < 3.1

में लागू नहीं है लेकिन अगर आप apectJ के साथ एक तरीके का उपयोग कर सकते हैं। निम्नलिखित पहलू को परिभाषित करें:

package org.acoveo.spring.utils; 
@Aspect 
public class OpenIDSpringAuthenticationHackAspect { 
    static ThreadLocal<Authentication> authHolder = new ThreadLocal<Authentication>(); 
    @Around(value="execution(* org.springframework.security.openid.OpenIDAuthenticationProvider.authenticate(..))") 
    public Object around(ProceedingJoinPoint jp) throws Throwable { 
     try { 
      Authentication auth = (Authentication) jp.getArgs()[0]; 
      authHolder.set(auth); 
      Object returnVal = jp.proceed(); 
      authHolder.set(null); 
      return returnVal; 
     }catch(Throwable e) { 
      System.out.println("Exception while running OpenIDSpringAuthenticationHackAspect"); 
      e.printStackTrace(); 
      return null; 
     } 
    } 
    public static Authentication getTransientAuthentication() { 
     return authHolder.get(); 
    } 
} 

और अपने aop.xml में इसे पंजीकृत:

public UserDetails loadUserByUsername(String username, boolean includeTemporary) throws UsernameNotFoundException, DataAccessException { 
    Authentication auth = OpenIDSpringAuthenticationHackAspect.getTransientAuthentication(); 
    if(auth != null && auth instanceof OpenIDAuthenticationToken) { 
     // First try to find the user by their openid email address 
     OpenIDAuthenticationToken openIdToken = (OpenIDAuthenticationToken)auth; 
     String email = null; 
     for(OpenIDAttribute attr : openIdToken.getAttributes()) { 
      if("email".equals(attr.getName()) && attr.getValues() != null && !attr.getValues().isEmpty()) { 
       email = attr.getValues().get(0); 
       break; 
      } 
     } 
     // TODO retrieve and return user 
+0

याद रखें कि आपको अभी भी वसंत बताने की आवश्यकता है कि आप ** <विशेषता-विनिमय> ** टैग का उपयोग करके ईमेल विशेषता चाहते हैं। – Florian

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