有关类似主题的最新讨论,请检查this问题出来了。
验证特定用户是否拥有网站所有权的最佳方法是什么?
假设您有这个模型:
class User < ActiveRecord::Base
has_many :websites
end
为了确保用户确实拥有该网站,我考虑进行电子邮件验证。示例:用户将 example.com 列为其网站,并发送电子邮件至[电子邮件受保护]。如果用户从 example.com 发送响应消息,则该网站是有效的。
问题是,如果有一个网站,一大群人可以从具有该域名的网站(例如 gmail.com)发送电子邮件。我不希望用户将 Gmail 注册为他们的个人网站。
因此,最好的方法似乎是让用户在 HTML 中嵌入一些代码,并且 Rails 应用程序确保该代码在那里。
你会怎样做呢?
这就是您如何使用 RESTful 风格的 google 子域方法来验证域。您将允许用户创建站点记录,该记录将保持未验证状态,直到用户稍后单击链接/按钮来验证域(以允许 DNS 传播)。
此代码未经测试,但可以帮助您入门。
Model:
class Site < ActiveRecord::Base
# schema
# create_table "sites", :force => true do |t|
# t.string "domain"
# t.string "cname"
# t.integer "user_id"
# t.boolean "verified"
# t.datetime "created_at"
# t.datetime "updated_at"
# end
require "resolv"
YOUR_DOMAIN = "example.com"
belongs_to :user
before_create :generate_cname
attr_accessible :domain
…
# Validate unless already validated
def validate!
validate_cname unless self.verifed == true
end
protected
# Generate a random string for cname
def generate_cname
chars = ('a'..'z').to_a
self.cname = 10.times.collect { chars[rand(chars.length)] }.join
end
# Sets verifed to true if there is a CNAME record matching the cname attr and it points to this site.
def validate_cname
Resolv::DNS.open do |domain|
@dns = domain.getresources("#{cname}.#{domain}", Resolv::DNS::Resource::IN::CNAME)
self.verified = [email protected]? && @dns.first.name.to_s == YOUR_DOMAIN
end
end
end
控制器
class SitesController < ActionController::Base
# Usual RESTful controller actions
# …
def validate
@site = current_user.sites.find(params[:id])
@site.validate!
respond_to do |format|
if @site.save && @site.verified
flash[:notice] = 'Site verified!'
format.html { redirect_to(@site) }
format.xml { head :ok }
else
flash[:Error] = 'Site verification failed!'
format.html { redirect_to(@site) }
format.xml { render :status => :unprocessable_entity }
end
end
end
end
将其放入routes.rb中:
map.resources :sites, :member => { :validate => :put }
我将把实施这些观点作为您的练习。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)