2010-04-27 28 views
8

OpenId oturum açma ve kayıt ile bir spring security 3.0.2 kullanarak bir uygulama yapıyorum. Başarıyla giriş yapabilirim, ancak kullanıcı kayıtlı değilse, yapmak istiyorum:OpenId kimlik doğrulaması ve Spring Security 3.0.2 ile otomatik kayıt

1) E-posta ve ad gibi bazı OpenId özniteliklerini alın.
2) Sadece bu iki alana ve doldurulmuş OpenId URI'ye sahip bir kayıt formunu kullanıcıya gösterin.

Çok araştırıyorum ama bunu yapmak için "elverişli" bir yol bulamadım. Bazıları bu stratejiyi uygulamamda uygulamak için bir çözüm bulabilir miyim?

Şimdiden teşekkürler.

cevap

5

Uygulamanın önce profiline erişmesine izin vermesi gerektiğinden, kullanıcının e-posta adresini ve adını kendiliğinden kaydetmeden/giriş yapmadan gösteremezsiniz. . Sen

o oturum sonra yaptığı OpenID'yi posta vb ile ona bu sayfayı göstermek Kullanmak istediğiniz nitelikleri tanımlayın: kullanıcı login olduktan sonra, niteliklere erişmek sonra

<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> 

Ve :

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

example from the spring repository göz at ve OpenId Support Documentation. Eğer apectJ bir çözümü kullanabilirsiniz Ancak Bahar güvenlik < 3.1

uygulanmadı

+0

@dude: En UserDetailsService içinde Sonra

<!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> 

, aşağıdaki gibi OpenID niteliklerini erişebilir : Ben benzer bir sorun var ve sizin tarafınızdan önerilen cevabı kullandım ... ama kod çalışmıyor gibi görünüyor .... http://stackoverflow.com/questions/7228733/openid-attribute-exchange-is bir göz atın -not-çalışma-yay-securit y – aProgrammer

0

.

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(); 
    } 
} 

ve aop.xml bunu kayıt: Aşağıdaki yönünü tanımlayın

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

Hala baharı, e-posta özelliğinin ** ** etiketini kullanarak istediğinizi söylemeniz gerektiğini unutmayın. – Florian

İlgili konular