JustQyx

大道至简

Rails Admin Authentication

| Comments

今天想学习一下 omniauth 的使用,但是使用前,想重新整理出以前在做登录时是怎么做的。

曾经,做个登录竟然花了3天,现在看来,怎么都不敢想象,责备自己怎么基础学得这么烂。

天啊,以前的日子究竟都在干什么呀!

想法

一个小小的web app,分为前台和后台。前台的页面都不需要登录,后台的页面需要登录。

General Authentication Module

只需要包含进某个控制器就可以用了。

(authenticate_user.rb) download
1
2
3
4
5
6
7
8
9
10
11
12
13
module AuthenticateUser
  def self.included(base)
    base.helper_method :current_user, :user_signed_in?
  end

  def current_user
    @current_user ||= (session[:user_id] && User.find_by_id(session[:user_id]))
  end

  def user_signed_in?
    !!current_user
  end
end

helper_method 使得包含这个模块的控制器拥有current_useruser_signed_in?这两个方法,并且在视图里面也可以使用。

SessionsController控制器 和 User模型,一般都是根据自己的需要自己去写实际的逻辑。

Implementation: Admin Scope

为了实现后台必须登录的逻辑,可以这样实现

  • /admin/controller/action 开头的,都是后台页面的,需要登录
  • /controller/action 类似的,都是普通的页面,用户可以随便浏览

于是我们可以这样

rails g controller Admin::Base,基本代码为

(base_controller.rb) download
1
2
3
4
5
6
7
8
9
10
11
12
# encoding: utf-8
class Admin::BaseController < ActionController::Base
  include AuthenticateUser
  protect_from_forgery with: :exception
  before_filter :require_login

  protected
  def require_login
    return true if user_signed_in?
    redirect_to root_path
  end
end

总结

现在有一些关于登录校验一些不错的插件,最熟悉的莫过于devise

但是基本都是这样的一个原理,个人觉得,有机会还是要多学习最原始的,最基础的东西,出来工作就比较难了。

因为公司一般不想培养人,成本太高,又基本很难留住,所以基本上要求的都是能直接开发的。

工具可以大大加快开发速度,但是对于新人来说,这并不是最好的。

新人需要有人去引导。

Comments