Ruby on Rails创建你自己的User并实现登陆功能
2012-12-28 15:02
423 查看
话说rails里面有许多gem可以实现用户管理等等各种复杂的功能,但是对于一个初上手ror的菜鸟来说,未免也会显得有点无从下手,所以我们干脆来做一个简单的用户类,来了解一些基本的概念,之后用其他人的gem的时候也会得心应手。
ok,现在
下面这些代码是你需要加在User.rb这个对象中的
此时还需要
然后我们rails c进入控制台
这里解释一下ror中的new和create的区别,就是new的时候没有保存对象到数据库,create的时候会保存,如果在你new一个对象之后再save一下,那么作用就和create的作用是一样的。至于ruby中为什么用“=>”来表示赋值,可能是因为看起来比较酷吧~
此时你User.all的时候就能看见你刚刚创建的对象了,很嗨皮是吧,可是我们要怎么才能和这个User一起嗨皮呢?
然后我们需要session_controller.rb
此时传进去了两个参数,是从view那边post过来的东西,我们用ApplicationController自己带的一个params的方法把post过来的数据抓取住。(话说我之前玩芯片总是被各种寄存器折磨的要死,现在看见这些东西觉得好神奇#^=^#,你可以不需要操心底层的是怎么做事的了~)
下面贴出在User的authenticate代码
加上self之后,这个方法就成为了一个私有方法,不能被别人随便调用。authenticate里面首先根据login判断这个user是否存在我们的数据库中,如果在就返回这个user,将其中的salt和输入的password用SHA256给它整到一起,看看能不能凑成之前存的hashed_password这个值,如果凑成了就说明密码是对的,没有就返回错啰~
现在我们还要在view/sessions/new.html.erb给它加上一些表单,然后我们就能欢快的登陆了
ok,现在
rails generate model user login:string hashed_password:string salt:string
下面这些代码是你需要加在User.rb这个对象中的
class User < ActiveRecord::Base attr_accessible :login, :password validates :login, :presence => true def password @password end def password=(pass) return unless pass @password = pass generate_password(pass) end private def generate_password(pass) salt = Array.new(10){rand(1024).to_s(36)}.join self.salt, self.hashed_password = salt, Digest::SHA256.hexdigest(pass + salt) end end对于初学者来说,上面这部分代码可能会比较难以理解一些,在这里主要是定义了一个password方法用来接受创建用户的时候输入的密码,为了避免密码被明文存储所以需要一个password的产生器用以将密码加密,在这里我们使用的加密方式是SHA256而不是之前的MD5,这个原因呢据说是因为一个中国女博士的功劳,让破解MD5的加密变得比较轻松了。最后存我们要存两个东西,一个是hashed_password,另一个是salt,前者是加密的密码,后者存了关于这次加密的一些信息,用来后面的密码验证用的。
此时还需要
rake db:migrate
然后我们rails c进入控制台
User.create(:login => "gonjay", :password => "111111")
这里解释一下ror中的new和create的区别,就是new的时候没有保存对象到数据库,create的时候会保存,如果在你new一个对象之后再save一下,那么作用就和create的作用是一样的。至于ruby中为什么用“=>”来表示赋值,可能是因为看起来比较酷吧~
此时你User.all的时候就能看见你刚刚创建的对象了,很嗨皮是吧,可是我们要怎么才能和这个User一起嗨皮呢?
rails generate scaffold session
然后我们需要session_controller.rb
class SessionsController < ApplicationController def new end def create @user = User.authenticate(params[:login], params[:password]) if @user session[:user_id] = @user.id flash[:notice] = "Weclome #{@user.login}" redirect_to posts_path else flash[:notice] = "The login or password is not correct." redirect_to new_session_path end end end这个控制器继承了基本的应用控制器类,我们在create方法中做了一些事情,此时用到了User的authenticate方法,这个方法暂时还没有写,先把坑挖了放这里。
此时传进去了两个参数,是从view那边post过来的东西,我们用ApplicationController自己带的一个params的方法把post过来的数据抓取住。(话说我之前玩芯片总是被各种寄存器折磨的要死,现在看见这些东西觉得好神奇#^=^#,你可以不需要操心底层的是怎么做事的了~)
下面贴出在User的authenticate代码
def self.authenticate(login, password) user = User.find_by_login(login) if user && Digest::SHA256.hexdigest(password + user.salt) == user.hashed_password return user end false end
加上self之后,这个方法就成为了一个私有方法,不能被别人随便调用。authenticate里面首先根据login判断这个user是否存在我们的数据库中,如果在就返回这个user,将其中的salt和输入的password用SHA256给它整到一起,看看能不能凑成之前存的hashed_password这个值,如果凑成了就说明密码是对的,没有就返回错啰~
现在我们还要在view/sessions/new.html.erb给它加上一些表单,然后我们就能欢快的登陆了
<h1>Admin Login</h1> <%= form_tag sessions_path do -%> <label for="login">Login</label> <%= text_field_tag :login, params[:login] %> <label for="password">Password</label> <%= password_field_tag :password, params[:password] %> <%= submit_tag "Login"%> <% end %>
相关文章推荐
- 通过弹出层实现新建功能 ruby on rails
- 在Ruby On Rails中实现Mail发送的功能
- 通过js实现删除功能 ruby on rails
- 通过js实现删除功能 ruby on rails
- Ruby on Rails实现最基本的用户注册和登录功能的教程
- RubyOnRails在redactor中通过paperclip实现图片上传并编辑的功能
- 通过js实现编辑功能ruby on rails 弹出层
- 通过js实现编辑功能ruby on rails 弹出层
- 通过弹出层实现新建功能 ruby on rails
- Ruby on Rails,创建最简单的视图/控制器单元Hello World
- Ruby on Rails,创建和执行migrations迁移文件
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- Ruby on Rails,使用new和create创建ActiveRecord对象及他们之间的区别
- 基本身份验证(HTTP Basic Authentication)及在Ruby on Rails下的实现
- Ruby on Rails(ROR) 实例开发之一 创建开发项目环境
- Ruby on ralis 购物车功能实现(一)
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车
- 创建一个Ruby on Rails应用程序
- Ruby on Rails,创建和执行migrations迁移文件