4

私は自分のプロジェクトに Spring MVC と Spring Security を使用しています。これは、認証に自分のユーザー データを使用しています。しかし今、私はFacebookと統合しようとしています。Facebookでアプリを作成したということは、クライアントIDとクライアントシークレットを取得したことを意味します。また、SOのいくつかの質問といくつかのドキュメントを読みましたが、まだ立ち往生しています...

Facebookでログインするためのコントローラーを作成します:

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/login/")
public class LoginController {

    String fb_app_id="my_client_id";
    String redirect_url="localhost:8888";
    String state="public_profile,email,user_friends";
    String key="my_client_secret";

    @RequestMapping("/facebook")
    public String login( ModelMap model) {

        String url="https://www.facebook.com/dialog/oauth/?"
                   + "client_id=" + fb_app_id
                   + "&redirect_uri=" + redirect_url
                   + "&scope=email,publish_stream,user_about_me,friends_about_me"
                   + "&state=" + key
                   + "&display=page"
                   + "&response_type=code";
        return "redirect:"+url;

    }

}

接続しようとすると、以下のJavascriptで自分の名前を表示できるので、うまくいくと思います:

function testAPI() {
  console.log('Welcome!  Fetching your information.... ');
  FB.api('/me', function(response) {
    console.log('Good to see you, ' + response.name + '.');
    document.getElementById('status').innerHTML = 'Good to see you, ' +
      response.name;
  });
}

しかし、それをSpring Securityと統合する方法をまだ混乱させています。誰かに例があれば、私は感謝します...

これは私の spring-security.xml です

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <http pattern="/common/*" security="none" />

    <http auto-config="true">
        <intercept-url pattern="/maintenance/*" access="ROLE_USER" />
        <intercept-url pattern="/_ah/*" access="ROLE_USER" />
        <intercept-url pattern="/predict/*" access="ROLE_USER" />

        <form-login login-page='/' default-target-url='/predict/list'
            login-processing-url="/login_check" authentication-failure-url="/index?login_error=2"
            always-use-default-target="true" />
        <logout logout-url="/logout" logout-success-url="/index" />
    <!--    <custom-filter ref="socialAuthenticationFilter" before="PRE_AUTH_FILTER" /> -->
    <!--    <custom-filter before="FORM_LOGIN_FILTER"
            ref="facebookAuthenticationFilter" /> -->
    </http>

    <authentication-manager>
        <authentication-provider ref="gaeAuthenticationProvider" />
    <!--    <authentication-provider ref="authenticationProviderFacebook"> 
        </authentication-provider>-->
    </authentication-manager>

    <beans:bean id="gaeAuthenticationProvider"
        class="com.games.predictor.security.AuthenticationProvider" />

</beans:beans>  

JPAでユーザーデータを認証する独自のクラスがあります...

package com.games.predictor.security;

import java.util.List;

import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import com.games.predictor.UserDAO;


public class AuthenticationProvider extends AbstractUserDetailsAuthenticationProvider
{
    //private SecurityDao securityDao; 

    @Override
    protected UserDetails retrieveUser(String username,
            UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException
    {
        final String password = authentication.getCredentials().toString();
        System.out.println(username+"===="+password);
        //This line for validating user with database
        boolean isValidUser = UserDAO.INSTANCE.isValidUser(username, password);
        if (isValidUser)
        {
            final List<SimpleGrantedAuthority> authorities = UserDAO.INSTANCE.getAuthoritiesByUser(username);
            //User u=new User(username,password,);
            return new User(username, password, true, true, true, true, authorities);
        }
        else
        {
            authentication.setAuthenticated(false);
            throw new BadCredentialsException("Username/Password does not match for " 
                + authentication.getPrincipal());
        }

    }

    @Override
    protected void additionalAuthenticationChecks(UserDetails arg0,
            UsernamePasswordAuthenticationToken arg1)
            throws AuthenticationException {
        // TODO Auto-generated method stub

    }
}

ここ数日でいくつかの調査を行いましたが、それでも立ち往生しています。

私のプロジェクト スタック: Java、Spring MVC、Spring Security、Google App Engine、Google Data Store、JPA。(Spring Social Core と Spring Social Facebook を追加)

4

2 に答える 2

2

Facebookを手動で処理する必要はないと思います。OAuth (Facebook、Twitter、Google...)、CAS、SAML、OpenID (Connect)、および GAE を認証するための非常に簡単なライブラリ: https://github.com/pac4j/spring-security-pac4jを使用できます。デモを見る: https://github.com/pac4j/spring-security-pac4j-demo

于 2015-06-12T06:54:38.913 に答える
1

ダニエル、どこで行き詰まっているのか詳しく教えてください。Facebookログインを統合するために同じスタックを使用しました。ただし、Spring Social は使用しませんでした。必須ではないと思います。

Facebook ログインを既存のログインに統合する手順。

  1. facebook ログイン用の jsp でfacebook javascript プラグインを使用します。
  2. ユーザーがアプリを承認したら。OAuth は、グラフ API を使用してクライアントの電子メール ID をフェッチすることを使用して、認証トークンを生成します。
  3. Ajax を使用してメール ID をサーバーに送信します。
  4. サーバー側に送信された電子メール ID をデータベース内の電子メール ID と比較します。
  5. メール ID が同じ場合は、ユーザーにログインします。

認証トークンは一時的なものなので、サーバー側に送信したり、データベースに保存したりするのは無意味だと思います。クライアント側でローカルに保存されます。そして、fb javascript プラグインがそれを処理します。このようにして、Spring Social facebook を実装する手間が省けます。

Facebook のログインにコントローラーを使用しているようですが、必須ではありません。fb JavaScript プラグインを使用するのは本当にシンプルで簡単です。

于 2014-05-16T18:20:06.987 に答える