JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Languages on JVM » JRuby  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 利用LoginGenerator建立你的Login系統
weijenlu





發文: 30
積分: 6
於 2007-05-12 13:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
前言
現在的網路壞人很多,可是我們也把越來越多的東西放到web上面去,這個時候好的認證登入功能可以提供一個比較安全的環境來保護我們的網頁,而號稱10倍開發速度的Ruby on Rails當然是不會缺少這一樣功能的。

Rails提供一個稱為LoginGenerator的plugin,可以為你的網頁程式提供簡單的登入認證的功能。LoginGenerator是一個MVC產生器,讓你可以登入,登出,新增/刪除使用者。而你其他的controller,只需短短的一行,就可以具有認證保護的功能。

安裝
安裝LoginGenerator只需要一道指令:
1
gem install login_generator


產生你的login系統
在你的project中輸入下列指令:
1
 script/generator login Account

LoginGenerator會在你的project中產生下列的檔案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 project/ 
lib/login_system.rb
app/controllers/account_controller.rb
app/helpers/account_helper.rb
app/models/user.rb
app/views/layouts/scaffold.rhtml
app/views/account
app/views/account/welcome.rhtml
app/views/account/login.rhtml
app/views/account/logout.rhtml
app/views/account/signup.rhtml
test/functional/account_controller_test.rb
test/unit/user_test.rb
test/fixtures/users.yml
public/stylesheets/scaffold.css
README_LOGIN


接下來你要自己建立資料庫,設定連線,然後建立一個users的表格。這個users的表格,我是用Migrate做的,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :login, :string, :default => nil
      t.column :password, :string, :default => nil
    end
    User.create(:login=> 'admin', 
               :password=> 'password',
               :password_confirmation => 'password')
  end
 
  def self.down
    drop_table :users
  end
end

當你新增user在migration中時,記得要加上password_confirmation喔,
然後編輯你的app/controllers/application.rb:
1
2
3
4
5
6
7
require 'login_system'
class ApplicationController < ActionController::Base
  # Pick a unique cookie name to distinguish our session data from others'
  session :session_key => '_LoginGeneratorTest_session_id'
  include LoginSystem
model :user
end

現在我們可以來測試一下了。
登入:


登入成功:


登出:


新增使用者:


如果你要你的某個controller內的所有method都需經過login後才能看到,那你可以在你的controller裡面加上這一行: before_filter :login_required。你的controller看起來就像這樣:
1
2
3
4
5
6
7
8
9
class AccountController < ApplicationController
  before_filter :login_required
  model :user
  layout 'scaffold'
 
  def login
    ...
  end
end


如果你希望你的controller中,某幾個method無須login就可以被看到,例如我們的AccountController的login,無須login,就可以被使用,否則大家怎麼login,那你可以將login method用下面的方法排除在外:
1
2
3
4
5
6
7
8
9
class AccountController < ApplicationController
 before_filter :login_required, :except=>[:login]
  model :user
  layout 'scaffold'
 
  def login
     ...
  end
end


現在我們來測試看看能否直接使用新增使用者,新增使用者你需要使用signup這個method,我們先登出,然後在網址列輸入http://localhost:3000/account/signup這個網址。你會發現網址會變成http://localhost:3000/account/login,表示你沒有login前,你無法新增使用者。你可以在試試登入成功(welcome),登出(loginout)等method看看。

如果你只要保護某些method,你可以使用:before_filter :login_required, :only=>[:test1, test2]

危險的Method: delete
在accountController中,有一個危險的method,就是delete。他可以讓你刪除使用者。我們來實驗一下,我們先新增兩個user,就稱為test1, test2。新增完,我們來看看資料庫中的內容:
我們可以看到test2的id是4,那我們先利用test1登入進去,然後在網址列輸入http://localhost:3000/account/delete?id=4

結果網頁跳回welcome頁面,而資料庫中的test2也不見了。結果就是,大家都可以刪來刪去,那就太可怕了。

解決的方法很多種,例如設定role,你需要屬於某個role你才能刪除使用者等等。

修改密碼
既然有了登入系統,那我們免不了是要修改密碼了,不過LoginGenerator是沒有提供預設的修改密碼可以使用的(從文件上看,好像以前有,不知道為什麼後來沒有了),那我們來做做看吧,也可以來學學在login系統中新增method。

首先,我們新增一個view,我們命名為change_password.rhtml,其內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%= start_form_tag :controller=>"account", :action=>"change_password" %>
  <div title="password alteration" id="password alteration" class="form">
  <div class="error_message">
    <%if @session['message'] %>
      <%=@session['message']%>
    <%end%>
    <br />
  </div>
 
  <label for="user_old_pass">舊密碼:</label><br />
  <input name="old_password" id="old_password" tabindex="2" type="password" /><br />
  <label for="user_new_pass">新密碼:</label><br />
  <input name="new_password" id="new_password" tabindex="2" type="password" /><br />
  <label for="user_new_pass_confirmation">密碼確認:</label><br />
  <input name="new_pass_confirmation" id="new_pass_confirmation" tabindex="2" type="password" /><br />
  <input type="submit" value="修改密碼" class="primary" />
  </div>
<%=end_form_tag%>


當然,在controller中我們會有一個對應的change_password method。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  def change_password
    @user = @session['user']
    @session['message'] = nil
    case @request.method
      when :post
        unless @user.password_check?(@params['old_password'])
          @session['message'] = '你輸入了錯誤的舊密碼'
        else unless @params['new_password']==@params['new_pass_confirmation']
          @session['message'] = '你的新密碼與密碼確認不一樣'
        else
          @session['message'] = '密碼修改成功' if @user.change_password(@params['new_password'])
        end
      end
    end
  end


而在model user中,我們新增一個檢查密碼的method,我們命名為password_check
1
2
3
  def password_check?(pass)
    self.password == self.class.sha1(pass)
  end


就這樣簡單的幾行,我們就完成了修改密碼的功能,現在我們可以來試試看了。記得要登入喔。

修改密碼頁面:


故意輸入錯誤的密碼:


故意把新密碼,與密碼確認打錯:


成功修改密碼:


reply to postreply to post
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
b8201032





發文: 273
積分: 0
於 2007-05-25 10:53 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
您好
很棒的文章

我還在努力學 ruby on rails 中
可以請教你二個問題嗎?

問題一:login問題,不知道可否請教一個問題
我想用ruby on rails 存取 舊的資料庫中的資料
一開始 要login 時
如果用 LoginGenerator 這東西 可以改成
讀取舊的資料庫中的帳號與密碼呢

問題二:關於報表,我看書 與網路上查資料,都只有介紹 用rails rake 建立資料表
沒有人介紹 最基本的 讀 或者 做報表
可否再請問一下 可以用ruby on rails
快速的開發 公司所要的報表給客戶表 查看嗎


reply to postreply to post
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
weijenlu





發文: 30
積分: 6
於 2007-05-25 11:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
回答一:應該可以,可是我沒用過,有關跟Lagacy System的Database或多個Database的問題,建議你看Rails Recipes這本書,在P65, 73中有說到,我想你應該需要去Override LoginGenerator的某些Method。

回答二:如果你已經把Database的Table建好,並利用rake generator建立好Active Record了,那答案應該就是scaffold。基本的CRUD都做好了,只是醜了點。


reply to postreply to post
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
koji

秒速5センチメートル

站長

發文: 8415
積分: 19
於 2007-05-25 12:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果是指是看資料 那應該scaffold可以看到全部XD

我想原po是要類似pdf or excel or word輸出是嗎?

那可能就得看一下有沒有對應的報表輸出api..
我記得有pdf.
word or excel這種不知道有沒有,得找看看

koji


reply to postreply to post
JCConf Taiwan 2015 開始售票了!!
Facebook上的TWJUG社團,歡迎加入
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
blackanger





發文: 3
積分: 0
於 2007-06-12 01:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
goldberg也不错。。。

reply to postreply to post
海峡两岸,和平共处,共同进步,拒绝战争!
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
zusocfc





發文: 11
積分: 0
於 2008-02-14 02:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Rails 2.0後好像Login Generator就不能使用了?
看source已經找不到model這個.. method? function? 我不知道=_="
而且好像在1.2的時代model就被移除掉了?
而LoginGenerator中,model :model_name的做法既然不能用
就找不到Model了啊 囧
看來,只能用acts_as_authenticate?


reply to postreply to post
作者 Re:利用LoginGenerator建立你的Login系統 [Re:zusocfc]
linexpmail

好玩就好



發文: 456
積分: 15
於 2008-02-14 09:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Rais2 已經內建 HTTP Basic Authorization 支援,就是瀏覽器會跳出
視窗的那種,對於不支援 HTTP Session 的 REST 客戶端很有用,
http_authentication.rb 源碼中有提到 HTTP Basic Authorization / HTTP Session
兩者混用的範例可以參考看看。

/trunk/actionpack/lib/action_controller/http_authentication.rb


reply to postreply to post
不除妄想不求真
作者 Re:利用LoginGenerator建立你的Login系統 [Re:weijenlu]
zusocfc





發文: 11
積分: 0
於 2008-02-14 13:20 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝linexpmail Big Smile

reply to postreply to post
» JWorld@TW »  Languages on JVM » JRuby

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8