2011-06-30 10 views
2

私は自分のためのアプリケーションを書いているので、私は急いでいないし、私の唯一の目標は物事を適切に行うことです。 認証のために私はdeviseを使用しますが、私はそれをたくさんカスタマイズしていました。 Rails 3.1には、自分自身の認証を実装しやすくする良い機能がいくつかあります。Devise:カスタマイズが非常に多いのはいつですか?

一般的に、いつDeviseが役に立たなくなり、あなたの道がはじまりますか? ここには私が現時点で持っているカスタマイズのリストがありますが、もちろん見解の横にありますが、まだ少なくともSEOフレンドリーなURLを実装したいと思います。

# model/User.rb 
    #this method is called by devise to check for "active" state of the model 
    def active? 
    #remember to call the super 
    #then put our own check to determine "active" state using 
    #our own "is_active" column 
    super and self.is_active? 
    end 


protected #==================================================================== 

    # find in db the user with username or email login 
    def self.find_record(login) 
    where(attributes).where(["name = :value OR email = :value", { :value => login }]).first 
    end 

    # allow no case sensitive email 
    # (saved downcase, fetched downcase) 
    def self.find_for_authentication(conditions) 
    conditions[:email].downcase! 
    super(conditions) 
    end 

    # find the user in the db by username or email 
    def self.find_for_database_authentication(conditions) 
    login = conditions.delete(:login) 
    where(conditions).where(["name = :value OR email = :value", { :value => login }]).first 
    end 

    # Attempt to find a user by it's email. If a record is found, send new 
    # password instructions to it. If not user is found, returns a new user 
    # with an email not found error. 
    def self.send_reset_password_instructions(attributes={}) 
    recoverable = find_recoverable_or_initialize_with_errors(reset_password_keys, attributes, :not_found) 
    recoverable.send_reset_password_instructions if recoverable.persisted? 
    recoverable 
    end 

    def self.find_recoverable_or_initialize_with_errors(required_attributes, attributes, error=:invalid) 
    case_insensitive_keys.each { |k| attributes[k].try(:downcase!) } 

    attributes = attributes.slice(*required_attributes) 
    attributes.delete_if { |key, value| value.blank? } 

    if attributes.size == required_attributes.size 
     if attributes.has_key?(:login) 
     login = attributes.delete(:login) 
     record = find_record(login) 
     else 
     record = where(attributes).first 
     end 
    end 

    unless record 
     record = new 

     required_attributes.each do |key| 
     value = attributes[key] 
     record.send("#{key}=", value) 
     record.errors.add(key, value.present? ? error : :blank) 
     end 
    end 
    record 
    end 

    # password not required on edit 
    # see: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password 
    def password_required? 
    new_record? 
    end 


# controllers/registrations_controller.rb 
# devise controller for registration 
class RegistrationsController < Devise::RegistrationsController 

    # update_attributes (with final S) without providing password 
    # overrides devise 
    # see: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password 
    def update 
    # Devise use update_with_password instead of update_attributes. 
    # This is the only change we make. 
    if resource.update_attributes(params[resource_name]) 
     set_flash_message :notice, :updated 
     # Line below required if using Devise >= 1.2.0 
     sign_in resource_name, resource, :bypass => true 
     redirect_to after_update_path_for(resource) 
    else 
     clean_up_passwords(resource) 
     render_with_scope :edit 
    end 
    end 

end 

はあなたに

答えて

4

私は当面の間、細かいことに気をつけています。あなたの変更は巨大ではありません。しかし、私はフォークを掘り下げ、新しい機能に加えた変更を抽出します。それからそれらを引っ張って自分自身を考案しようとする。それを維持するという方法はあなたの上に落ちない、それは多くに落ちる可能性があります。

完全な認証システムを維持することは、本当に頭痛になる可能性があり、究極的には車輪を改革することになります。それは1つの間違いだけあなたを広げて残すことができますがかかる。

また、あなたの新しいfind_for_authentication方法、これは今...あなたの工夫初期化子に入れ、工夫に

config.case_insensitive_keys = [ :email ] 
+0

+1のおかげで多くのことを支えてきた、あなたはドン場合は宝石をupdatatingを目的とするものですそれに付随する修正を使用しないでください。 – ecoologic

0

いい質問をありがとう - 私の見解は、おそらく限り、それは物事が容易になりますよう、それは便利だということでしょう。あなたはいつでもgithubで掘り下げて、そこにカスタマイズを置くことができます。これは、私が1つのプロジェクトで行ったことです。私はまた、特に他の人が見てはならないものを見たい場合には、それを正しくすることが非常に重要なことがあるときに、自分の認証をロールバックすることについて少し神経質になります。しかし、私は他の人が何を考えているのか興味を持っています。

関連する問題