Rails实现一个blog项目02-登录功能和session的实现

来源:互联网 发布:js arra保留字 编辑:程序博客网 时间:2024/06/10 05:45


1.首先生成model user

rails g model user login:string hashed_password:string salt:string

去schema.rb检查无误后就近行数据的迁移


这个博客暂时不开放注册,利用console增加用户 

2.为user的login增加数据验证 

[ruby] view plaincopyprint?
  1. def password  
  2.     @password  
  3.   end  
  4.   
  5.   def password=(pass)       #password的set方法  
  6.     return unless pass   #pass为空直接返回false  
  7.     @password = pass  
  8.     generate_password(pass)  #产生实际的密码  
  9.   end  
  10.   
  11.   
  12.   private  
  13.   def generate_password(pass)  
  14.     salt =  Array.new(10){rand(1024).to_s(36)}.join   #加盐  
  15.     self.salt ,self.hashed_password =  
  16.         salt,Digest::SHA256.hexdigest(pass + salt) #利用SHA256进行加密    了  
  17.   end  

3. 这一步去做登录的功能,先生成sessions的controller

rails g controller sessions

4.添加路由 

resources :sessions

5.在sessions控制器中建立new和create两个action 

6.建立登录页面 

[html] view plaincopyprint?
  1. <h1>Admin Login</h1>  
  2.   
  3. <%= form_tag sessions_path do  -%>  
  4.   
  5.     <label for="login">Login</label>  
  6.     <%= text_field_tag :login , params[:login] %>  
  7.     <label for="password">Password</label>  
  8.     <%= password_field_tag :password , params[:password] %>  
  9.       
  10.     <%= submit_tag "Login" %>  
  11. <% end %>  

7.在Model中实现密码认证方法

[ruby] view plaincopyprint?
  1. def self.authentication(login,password)  
  2.     user = User.find_by_login(login)  
  3.     if user && Digest::SHA256.hexdigest(password + user.salt) ==   
  4.         user.hashed_password  
  5.       return user  
  6.     else  
  7.       false  
  8.     end  
  9.   end  



8.实现具体的create方法

[ruby] view plaincopyprint?
  1. def create  
  2.     @user = User.authentication(params[:login],params[:password])  
  3.     if @user  
  4.       session[:user_id] = @user.id  
  5.       flash[:notice] = "Welcome #{@user.login}"  
  6.       redirect_to posts_path  
  7.     else  
  8.       flash[:notice] = "The login or password is not corrent."  
  9.       redirect_to new_session_path  
  10.     end  
  11.   end  







0 0
原创粉丝点击