2011-09-05 19 views
23

私はSpringとSpring Securityの新機能です。誰かが次の問題を解決するのに役立つことを願っています。OpenIDとデータベース統合によるSpringセキュリティ

私が達成したいのは、このユーザーがOpenIDプロバイダ(gmail)によって正常に認証された後でユーザーのユーザー名と電子メールアドレスを抽出し、このユーザーのusermodelをロードするためにデータベースをチェックすることです。私の春-のsecurity.xmlで

、私は私の問題はUserDetailsS​​erviceOpenIDImpl.javaである

 
<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:security="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/security 
          http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <security:authentication-manager alias="openIDAuthenticationManager" /> 

    <bean id="authenticationSuccessHandler" class="org.school.openid.service.YouEatAuthenticationSuccessHandler"> 
     <property name="defaultTargetUrl" value="/krams/main/common" /> 
     <property name="attributes2UserDetails" ref="openIDAttributes2UserDetails" /> 
    </bean> 

    <security:http > 
     <security:anonymous enabled="false" /> 
     <security:logout /> 
     <security:openid-login user-service-ref="userDetailsServiceOpenIDImpl" authentication-success-handler-ref="authenticationSuccessHandler" 
      login-page="/krams/auth/login" authentication-failure-url="/krams/auth/login?error=true"> 
      <security:attribute-exchange> 
       <security:openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" /> 
       <security:openid-attribute name="firstName" type="http://axschema.org/namePerson/first" required="true" /> 
       <security:openid-attribute name="lastName" type="http://axschema.org/namePerson/last" required="true" /> 
      </security:attribute-exchange> 
     </security:openid-login> 
    </security:http> 

    <bean id="openIDAttributes2UserDetails" class="org.school.openid.service.OpenIDAttributes2UserDetailsImpl" /> 

    <bean id="userDetailsServiceOpenIDImpl" class="org.school.openid.service.UserDetailsServiceOpenIDImpl" /> 

</beans> 

 
public class UserDetailsServiceOpenIDImpl implements UserDetailsService { 

    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException, DataAccessException { 
     System.out.println(username); 
     //extract username and email address, HOW? 
    } 
} 

print文をプリントアウト

 
https://www.google.com/accounts/o8/id?id=AItOawlq2C3EdFAuqp-ski_xkgB8jsEKbe-mZE 

のようなものである必要があり私の質問は

です

(1)返されたURLからユーザー名と電子メールアドレスを抽出するにはどうすればいいですか(ユーザー名と電子メールアドレスが正しく返されたかどうかはわかりません)

(2)Eclipseでデバッグを実行すると、URL(https://www.google.com/accounts/o8/id?id=AItOawlq2C3EdFAuqp-ski_xkgB8jsEKbe-mZE)が返されたときにYouEatAuthenticationSuccessHandlerが呼び出されていないように見えます。

ありがとうございました。

編集: リンクhttp://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-openidありがとうございます。

それは、「属性値は、認証プロセスの一部として返され、次のコードを使用して、後でアクセスすることができます...」と言っている

私はloadUserByUsername方法に

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

を追加しました。しかし、 "token"オブジェクトはnullです。

編集2 次のページhttps://fisheye.springsource.org/browse/spring-security/samples/openid/src/main/webapp/WEB-INF/applicationContext-security.xml?hb=trueによって、私はユーザーの名前と電子メールアドレスを追加することができます。 私の春-のsecurity.xml

 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:security="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/security 
          http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 
    <security:authentication-manager alias="openIDAuthenticationManager" /> 
    <security:http pattern="/krams/auth/login" security="none"/> 
    <security:http auto-config="true" access-denied-page="/krams/auth/denied"> 
     <security:intercept-url pattern="/krams/main/*" access="ROLE_USER" /> 
     <security:anonymous enabled="false" /> 
     <security:logout 
      invalidate-session="true" 
      logout-success-url="/krams/auth/login" 
      logout-url="/krams/auth/logout"/> 
     <security:openid-login 
      user-service-ref="registeringUserService" 
      login-page="/krams/auth/login" 
      authentication-failure-url="/krams/auth/login?error=true" 
      default-target-url="/krams/main/common"> 
      <security:attribute-exchange identifier-match="https://www.google.com/.*"> 
       <security:openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" /> 
       <security:openid-attribute name="firstName" type="http://axschema.org/namePerson/first" required="true" /> 
       <security:openid-attribute name="lastName" type="http://axschema.org/namePerson/last" required="true" /> 
      </security:attribute-exchange> 
      <security:attribute-exchange identifier-match=".*yahoo.com.*"> 
       <security:openid-attribute name="email" type="http://axschema.org/contact/email" required="true"/> 
       <security:openid-attribute name="fullname" type="http://axschema.org/namePerson" required="true" /> 
      </security:attribute-exchange> 
     </security:openid-login> 
     <!-- if remember is needed 
     <security:remember-me token-repository-ref="tokenRepo"/> 
     -->  
    </security:http> 
    <bean id="tokenRepo" class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl" /> 
<!-- 
    A custom UserDetailsService which will allow any user to authenticate and "register" their IDs in an internal map 
    for use if they return to the site. This is the most common usage pattern for sites which use OpenID. 
--> 
    <bean id="registeringUserService" class="org.school.openid.service.CustomUserDetailsService" /> 
</beans> 

マイCustomUserDetailsS​​ervice.java

 
public class CustomUserDetailsService implements AuthenticationUserDetailsService { 

    /* 
    private final Map registeredUsers = new HashMap(); 
    */ 
     private static final List DEFAULT_AUTHORITIES = AuthorityUtils.createAuthorityList("ROLE_USER"); 
    protected static Logger logger = Logger.getLogger("service");  
    /** 
    * Implementation of {@code AuthenticationUserDetailsService} which allows full access to the submitted 
    * {@code Authentication} object. Used by the OpenIDAuthenticationProvider. 
    */ 
    public UserDetails loadUserDetails(OpenIDAuthenticationToken token) { 
     String id = token.getIdentityUrl(); 
     String email = null; 
     String firstName = null; 
     String lastName = null; 
     String fullName = null; 
     List attributes = token.getAttributes(); 
     for (OpenIDAttribute attribute : attributes) { 
      if (attribute.getName().equals("email")) { 
       email = attribute.getValues().get(0); 
      } 
      if (attribute.getName().equals("firstName")) { 
       firstName = attribute.getValues().get(0); 
      } 
      if (attribute.getName().equals("lastName")) { 
       lastName = attribute.getValues().get(0); 
      } 
      if (attribute.getName().equals("fullname")) { 
       fullName = attribute.getValues().get(0); 
      } 
     } 
     if (fullName == null) { 
      StringBuilder fullNameBldr = new StringBuilder(); 
      if (firstName != null) { 
       fullNameBldr.append(firstName); 
      } 
      if (lastName != null) { 
       fullNameBldr.append(" ").append(lastName); 
      } 
      fullName = fullNameBldr.toString(); 
     } 
     CustomUserDetails user = new CustomUserDetails(id,fullName,email, DEFAULT_AUTHORITIES);   
     logger.debug("Set username " + fullName + " email " + email); 
     return user; 
    } 
} 

マイCustomUserDetails.java

 
public class CustomUserDetails extends User { 
    private static final long serialVersionUID = 1L; 
    private String email; 
    private String name; 
    public CustomUserDetails(String id,String name, String email,Collection authorities) { 
     super(name, "unused", true,true,true,true,authorities); 
     this.email = email; 
     this.name = name; 
    } 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

そして

 
... 
<repository> 
    <id>org.springframework.maven.milestone</id> 
    <name>Spring Maven Milestone Repository</name> 
    <url>http://maven.springframework.org/milestone</url> 
</repository> 
... 
<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-core</artifactId> 
    <version>3.1.0.RC1</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
    <version>3.1.0.RC1</version> 
    <type>jar</type> 
     <scope>compile</scope> 
</dependency> 
<dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>3.1.0.RC1</version> 
    </dependency> 
     <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-openid</artifactId> 
     <version>3.1.0.RC1</version> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework</groupId> 
<artifactId>spring-webmvc</artifactId> 
<version>3.0.5.RELEASE</version> 
</dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-openid</artifactId> 
     <version>3.1.0.RC1</version> 
     <type>pom</type> 
     <scope>compile</scope> 
    </dependency> 

希望はあなたにいくつかを保存することができます時間。

+5

あなたの答えから質問を分解し、ここに回答を投稿しても構わないと思うなら、それはいいでしょう。あなたの問題に対する解決策があるようですが、完全には見えません。 – Makoto

+2

あなたはこのようなもののためにSpring Socialを見たいかもしれません。私は自分のプロジェクトの1つとして使っていますが、これよりも統合するほうがはるかに簡単です。彼らのドキュメンテーションは十分で、githubにいくつかの使用例があります。 –

+0

私は同意し、春の社会を見てください。 –

答えて

1

私はその質問のテキスト自体に答えが含まれていることがわかります。私は同じ問題を持つ他の開発者に分かりやすくするために、それを抜き出して回答として掲示しています。 質問に答えがあることを理解するまでにはしばらく時間がかかりました。

ユーザのメールアドレス&にアクセスするには、security xmlファイルに以下の設定を追加する必要があります。

<security:attribute-exchange identifier-match="https://www.google.com/.*"> 
    <security:openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" /> 
    <security:openid-attribute name="firstName" type="http://axschema.org/namePerson/first" required="true" /> 
    <security:openid-attribute name="lastName" type="http://axschema.org/namePerson/last" required="true" /> 
</security:attribute-exchange> 
<security:attribute-exchange identifier-match=".*yahoo.com.*"> 
    <security:openid-attribute name="email" type="http://axschema.org/contact/email" required="true"/> 
    <security:openid-attribute name="fullname" type="http://axschema.org/namePerson" required="true" /> 
</security:attribute-exchange> 

以下に示すように、その後、それは、AuthenticationUserDetailsServiceクラスにアクセスできるようになります。

public UserDetails loadUserDetails(OpenIDAuthenticationToken token) { 
    String id = token.getIdentityUrl(); 
     : 
     : 
    List attributes = token.getAttributes(); 
    for (OpenIDAttribute attribute : attributes) { 
     if (attribute.getName().equals("email")) { 
      email = attribute.getValues().get(0); 
     } 
     if (attribute.getName().equals("firstName")) { 
      firstName = attribute.getValues().get(0); 
     } 
     if (attribute.getName().equals("lastName")) { 
      lastName = attribute.getValues().get(0); 
     } 
     if (attribute.getName().equals("fullname")) { 
      fullName = attribute.getValues().get(0); 
     } 
    } 
     : 
     : 
    // form and return user object 
} 

我々は今、Javaベースの構成/豆の多くを使用することを考慮すると、Javaベースの構成にこれらのXML構成を翻訳することは問題にはなりません。

希望します。

関連する問題