Để bắt đầu thì chúng ta cùng tạo ra một app Rails mới.
1 2 3 | rails new session_practice cd session_practice |
Sau đó, chúng ta sẽ cùng tạo ra model User và controller của nó. Sau đó chúng ta cần có 1 controller nữa để xử lý việc custom routes để quản lý session.
Model
Chúng ta cần tạo ra 1 model với 2 attribute là username và password.
1 2 | rails g model user username password_digest |
Controller
UsersController
cần có 2 action là new
và create
. Và SessionsController
sẽ cần có 2 action để quản lý login fail và pass là new
và create
. Và chúng ta sẽ cần khai báo 4 đường dẫn đến 4 action này trong file routes.
Chúng ta cần sử dụng lệnh
1 2 3 | rails g controller users new create rails g controller sessions new create login welcome |
Bcrypt
Trong cơ sở dữ liệu, chúng ta sẽ không lưu trữ password thuần mà chúng ta sẽ mã hóa chúng bằng Bcrypt và lưu đoạn đã mã hóa vào trong DB. Vì vậy, chúng ta sẽ thêm gem bcrypt;
1 2 3 | gem install bcrypt bundle install |
Trong model User, chúng ta sẽ thêm một macro để sử dụng method Bcrypt.
1 2 3 4 | class User < ApplicationRecord has_secure_password end |
Routes
Việc tiếp theo chúng ta cần làm là thêm routes trong file config/routes.rb
1 2 3 4 5 6 7 | Rails.application.routes.draw do resources :users, only: [:new, :create] get 'login', to: 'sessions#new' post 'login', to: 'sessions#create' get 'welcome', to: 'sessions#welcome' end |
Giờ chúng ta cần có View để hiển thị nút Sigup và Login. Nếu user đã login thì hiển thị tên của họ.
View
Chúng ta cần thêm:
- Nút Signup và Login khi vừa vào trang, vì thế chúng ta sẽ thêm 2 nút này vào
sessions/welcome.index.erb
1 2 3 4 | <span class="token operator"><</span>h1<span class="token operator">></span><span class="token constant">Welcome</span><span class="token operator"><</span><span class="token operator">/</span>h1<span class="token operator">></span> <span class="token operator"><</span><span class="token string">%= button_to "Login", '/login', method: :get%> <%=</span> button_to <span class="token string">"Sign Up"</span><span class="token punctuation">,</span> <span class="token string">'/users/new'</span><span class="token punctuation">,</span> method<span class="token punctuation">:</span> <span class="token symbol">:get</span><span class="token operator">%</span><span class="token operator">></span> |
Nút Signup để chuyển hướng về
new
trongUsersController
vì thế chúng ta sẽ thêm form signup vàousers/new.html.erb
.Nút Login sẽ chuyển hướng về
new
trongSessiosController
, vì thế chúng ta sẽ thêm form login vàosessions/new.html.erb
.Form Signup
123456789<span class="token operator"><</span>h1<span class="token operator">></span><span class="token constant">Sign</span> <span class="token constant">Up</span><span class="token operator"><</span><span class="token operator">/</span>h1<span class="token operator">></span><span class="token operator"><</span><span class="token string">%= form_for @user do |f|%><%=</span> f<span class="token punctuation">.</span>label <span class="token symbol">:username</span><span class="token string">%><br></span><span class="token operator"><</span><span class="token string">%= f.text_field :username%><br><%=</span> f<span class="token punctuation">.</span>label <span class="token symbol">:password</span><span class="token string">%><br></span><span class="token operator"><</span><span class="token string">%= f.password_field :password%><br><%=</span> f<span class="token punctuation">.</span>submit <span class="token string">%><%end%></span>Biến
@user
sẽ được định nghĩa là@user = User.new
trong actionnew
củaUsersController
Khi người sử dụng click nút “Submit”, chúng ta sẽ chuyển hướng tới action
create
trongUsersController
.123456<span class="token keyword">def</span> <span class="token method-definition"><span class="token function">create</span></span><span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>create<span class="token punctuation">(</span>params<span class="token punctuation">.</span><span class="token keyword">require</span><span class="token punctuation">(</span><span class="token symbol">:user</span><span class="token punctuation">)</span><span class="token punctuation">.</span>permit<span class="token punctuation">(</span><span class="token symbol">:username</span><span class="token punctuation">,</span><span class="token symbol">:password</span><span class="token punctuation">)</span><span class="token punctuation">)</span>session<span class="token punctuation">[</span><span class="token symbol">:user_id</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">@user</span><span class="token punctuation">.</span>idredirect_to <span class="token string">'/welcome'</span><span class="token keyword">end</span>Đầu tiên, chúng ta tạo biến instance sau đó chuyển hướng về homepage. Sau đó thì chúng ta sẽ cần lưu user_id vào session.
Chúng ta sẽ cần tạo một method để lưu trữ thông tin của user đang đăng nhập. Vì thế, chúng ta cần thêm 1 method trong Application Controller để đảm bảo tất cả mọi nơi đều có thể truy cập vào method này1234<span class="token keyword">def</span> <span class="token method-definition"><span class="token function">current_user</span></span><span class="token constant">User</span><span class="token punctuation">.</span>find_by<span class="token punctuation">(</span>id<span class="token punctuation">:</span> session<span class="token punctuation">[</span><span class="token symbol">:user_id</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">end</span>Ngoài ra, chúng ta cần kiểm tra xem user đã login hay chưa
1234<span class="token keyword">def</span> <span class="token method-definition"><span class="token function">logged_in</span></span><span class="token operator">?</span><span class="token operator">!</span>current_user<span class="token punctuation">.</span><span class="token keyword">nil</span><span class="token operator">?</span><span class="token keyword">end</span>Để view có thể truy cập đc vào phương thức này, chúng ta cần sử dụng macro
helper_method
. Vì thế, ApplicationController của chúng ta sẽ như sau:12345678910111213<span class="token keyword">class</span> <span class="token class-name">ApplicationController</span> <span class="token operator"><</span> <span class="token constant">ActionController</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span>helper_method <span class="token symbol">:current_user</span>helper_method <span class="token symbol">:logged_in?</span><span class="token keyword">def</span> <span class="token method-definition"><span class="token function">current_user</span></span><span class="token constant">User</span><span class="token punctuation">.</span>find_by<span class="token punctuation">(</span>id<span class="token punctuation">:</span> session<span class="token punctuation">[</span><span class="token symbol">:user_id</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">end</span><span class="token keyword">def</span> <span class="token method-definition"><span class="token function">logged_in</span></span><span class="token operator">?</span><span class="token operator">!</span>current_user<span class="token punctuation">.</span><span class="token keyword">nil</span><span class="token operator">?</span><span class="token keyword">end</span><span class="token keyword">end</span>khi đó,, nếu user đã login rồi, chúng ta sẽ hiển thị ra tên của user, vì vậy file
sessions/welcome.html.erb
1234567<span class="token operator"><</span>h1<span class="token operator">></span><span class="token constant">Welcome</span><span class="token operator"><</span><span class="token operator">/</span>h1<span class="token operator">></span><span class="token operator"><</span><span class="token operator">%</span> <span class="token keyword">if</span> logged_in<span class="token operator">?</span> <span class="token string">%><h1></span><span class="token constant">You</span> are <span class="token constant">Logged</span> <span class="token constant">In</span><span class="token punctuation">,</span> <span class="token operator"><</span><span class="token string">%= current_user.username %></h1><% end %><%=</span> button_to <span class="token string">"Login"</span><span class="token punctuation">,</span> <span class="token string">'/login'</span><span class="token punctuation">,</span> method<span class="token punctuation">:</span> <span class="token symbol">:get</span><span class="token string">%><%= button_to "Sign Up", '/users/new', method: :get%></span>Sau khi chúng ta đã signup thì chúng ta sẽ lưu session cho người đó. CHúng ta sẽ implement một page để login trong
sessions/new.html.erb
123456789<span class="token operator"><</span>h1<span class="token operator">></span><span class="token constant">Login</span><span class="token operator"><</span><span class="token operator">/</span>h1<span class="token operator">></span><span class="token operator"><</span><span class="token string">%= form_tag '/login' do %><%=</span> label_tag <span class="token symbol">:username</span><span class="token string">%><%= text_field_tag :username %></span><span class="token operator"><</span><span class="token string">%= label_tag :password%><%=</span> password_field_tag <span class="token symbol">:password</span><span class="token string">%><%= submit_tag "Login"%></span><span class="token operator"><</span><span class="token operator">%</span><span class="token keyword">end</span><span class="token operator">%</span><span class="token operator">></span>Sau khi submit thì Sessions sẽ chịu trách nhiệm tìm user dựa trên username
12345678910<span class="token keyword">def</span> <span class="token method-definition"><span class="token function">create</span></span><span class="token variable">@user</span> <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span>find_by<span class="token punctuation">(</span>username<span class="token punctuation">:</span> params<span class="token punctuation">[</span><span class="token symbol">:username</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">if</span> <span class="token variable">@user</span> <span class="token operator">&&</span> <span class="token variable">@user</span><span class="token punctuation">.</span>authenticate<span class="token punctuation">(</span>params<span class="token punctuation">[</span><span class="token symbol">:password</span><span class="token punctuation">]</span><span class="token punctuation">)</span>sessions<span class="token punctuation">[</span><span class="token symbol">:user_id</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">@user</span><span class="token punctuation">.</span>idredirect_to <span class="token string">'/welcome'</span><span class="token keyword">else</span>redirect_to <span class="token string">'/login'</span><span class="token keyword">end</span><span class="token keyword">end</span>Nếu tìm thấy user, chúng ta sẽ kiểm tra xem có trùng password không. Để làm được điều này, chúng ta sử dụng method
authenticate
của Bcrypt.
Authorization
Trong 1 vài page, chúng ta cần đăng nhập, nhưng 1 vài page chúng ta không. Nên chúng ta có thể sử dụng filter để kiểm tra việc login.
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">ApplicationController</span> <span class="token operator"><</span> <span class="token constant">ActionController</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span> before_action <span class="token symbol">:authorized</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">authorized</span></span> redirect_to <span class="token string">'/welcome'</span> <span class="token keyword">unless</span> logged_in<span class="token operator">?</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
Khi thêm vào Application thì tất các các controller kế thừa đều sẽ cần authorized. Vì vậy, nếu controller nào không sử dụng, chúng ta có thể skip nó sử dụng method skip_before_action
1 2 3 4 5 6 7 | <span class="token keyword">class</span> <span class="token class-name">UsersController</span> <span class="token operator"><</span> <span class="token constant">ApplicationController</span> skip_before_action <span class="token symbol">:authorized</span><span class="token punctuation">,</span> only<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token symbol">:new</span><span class="token punctuation">,</span> <span class="token symbol">:create</span><span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token keyword">end</span> |
Vậy là chúng ta đã cài đặt xong việc authorization cho trang web của mình rồi.
Chúc các bạn thành công.
Học Ruby On Rails ở đâu hiệu quả, chỉ có thể là Awesome Academy. Tham khảo các khóa học lập trình tại Awesome Academy ở link https://awesome-academy.com/lich-khai-giang