0

私は主に PHP と ASP.NET のバックグラウンドを持っています。最近、私は Ruby に関わり、 と興味深い関係を築き始めていPadrinoます。Railsに似すぎず、Sinatraに似すぎません。

私は最初の本格的なアプリケーションを作成しPadrinoていますが、行き詰まるのにそれほど時間はかかりませんでした。助けていただければ幸いです。

私が信じている問題はPadrino Admin. OmniauthFacebookを使用して、ユーザーが自分の Web サイトにログインできるようにしようとしています。

私はこのチュートリアルに従っています: Padrino and Omniauth Overview

アプリケーションは でホストされていHerokuます。

結果:Facebookログイン時に、アカウントが作成されます (データベース内)。しかし、制限区域に到達すると、ログイン ページにリダイレクトされます。

これが私が持っているものです。

app.rb

module PDeen
  class App < Padrino::Application

    register Padrino::Admin::AccessControl

    register SassInitializer
    register Padrino::Rendering
    register Padrino::Mailer
    register Padrino::Helpers

    enable :sessions

    # get '/' do 
    #   "Welcome to me @ internet"
    # end

    use OmniAuth::Builder do
      provider :facebook,  'xxxx', 'yyyy' 
      # provider :facebook, 'app_id', 'app_secret'
    end

    set :login_page, "/login" # determines the url login occurs

    access_control.roles_for :any do |role|
      role.protect "/profile"
      role.protect "/admin" # here a demo path
    end

    # now we add a role for users
    access_control.roles_for :users do |role|
      role.allow "/profile"
    end

    get :index do 
      'Hi'
    end

    get :login do
      slim :'index'
    end

    get :profile do
      content_type :text
      current_account.to_yaml
    end

    get :destroy do
      set_current_account(nil)
      redirect url(:index)
    end

    get :auth, :map => '/auth/:provider/callback' do
      auth    = request.env["omniauth.auth"]
      # account = Account.find_by_provider_and_uid(auth["provider"], auth["uid"]) || 
      #           Account.create_with_omniauth(auth)
      # 
      account = User.first( :provider => auth["provider"], :uid => auth["uid"] )

      if ! account.nil?
        set_current_account(account)  
        redirect :existing
      end

      if account.nil? 
        # Create account
        account           = User.new 
        account.uid       = auth['uid']
        account.name      = auth['name']
        account.provider  = auth['provider']
        account.email     = auth['user_info']['email'] if auth['user_info']
        account.role      = 'users'

        account.save
      end 

      set_current_account(account)
      #redirect "http://" + request.env["HTTP_HOST"] + url(:profile)
      redirect :new
    end

    get :existing do 
      'existing'
    end

    get '/session/test' do 
      session[:test] = 'This is a test'
    end

    get '/session/print' do 
      "You saved: #{session[:test]}"
    end
  end
end

ユーザー.rb

class User
  include DataMapper::Resource

  # property <name>, <type>
  property :id, Serial
  property :name, String
  property :email, String
  property :role, String
  property :uid, String
  property :provider, String

end

どうなる >>

  1. リスト項目
  2. ~ [server]/profile>にリダイレクトします[server]/login
  3. Facebook をクリックします ~> アプリを受け入れるページに移動します ~> アプリにリダイレクトします
  4. ~ [server]/profile>にリダイレクトします[server]/login

セッションが機能していないと思いました。私が最初の PHP アプリに取り組んでいたとき、同様のセッション ベースの問題がありました。しかし、それが機能することが判明しました。そこで登場したのが[server]/session/testand[server]/session/printです。

にログインしてPadriono console使用HerokuするUser.allと、エントリが表示されます。

また、ユーザーが認証されることもわかります。`である必要がある何か

Padrino admin Accountsモーダルを確認しました。id重要なパラメータはとだと思いますrole

私は何か間違ったことをした?

前もって感謝します。どんな助けでも大歓迎です。

4

1 に答える 1

0

Padrino のソース コードを確認した後、認証Account用のクラスが必要であることに気付きました。Padrino Admin

私は、任意のクラスを作成してそれを使用できると想定していました。しかし、今のところ、モーダルを変更し、(上記) を使用Account.rbする代わりに を使用しました。UserAccount

解決したのでこれを書いているので、モーダルの検証セクションはコメントアウトされています。

class Account
  include DataMapper::Resource
  include DataMapper::Validate
  attr_accessor :password, :password_confirmation

  # Properties
  property :id,               Serial
  property :name,             String
  property :surname,          String
  property :email,            String
  property :crypted_password, String, :length => 70
  property :role,             String

  property :uid,              String
  property :display_name,     String
  property :provider,         String

  # # Validations
  # validates_presence_of      :email, :role
  # validates_presence_of      :password,                          :if => :password_required
  # validates_presence_of      :password_confirmation,             :if => :password_required
  # validates_length_of        :password, :min => 4, :max => 40,   :if => :password_required
  # validates_confirmation_of  :password,                          :if => :password_required
  # validates_length_of        :email,    :min => 3, :max => 100
  # validates_uniqueness_of    :email,    :case_sensitive => false
  # validates_format_of        :email,    :with => :email_address
  # validates_format_of        :role,     :with => /[A-Za-z]/

  # Callbacks
  before :save, :encrypt_password

  ##
  # This method is for authentication purpose
  #
  def self.authenticate(email, password)
    account = first(:conditions => ["lower(email) = lower(?)", email]) if email.present?
    account && account.has_password?(password) ? account : nil
  end

  ##
  # This method is used by AuthenticationHelper
  #
  def self.find_by_id(id)
    get(id) rescue nil
  end

  def has_password?(password)
    ::BCrypt::Password.new(crypted_password) == password
  end

  private
  def password_required
    crypted_password.blank? || password.present?
  end

  def encrypt_password
    self.crypted_password = ::BCrypt::Password.create(password) if password.present?
  end
end

ロールの直後に、 、 、 という 3 つのフィールドを追加したことに注意してuidください。display_nameprovider

それはまるで、uid provderアクセスrole制御にとって重要なことです。

controller/は、1 つのroute小さな変更を除いて同じです。それがモデル名です。

  if account.nil? 
    # Create account
    account               = Account.new 

Omniauthと で独自のモーダルを使用すると興味深いでしょうPadrino Admin helpers。でも、とりあえず、これはスゴイ!

于 2013-09-15T19:24:04.090 に答える