RailsCasts中文版,21 Super Simple Authentication 一个简略的认证实现

RailsCasts中文版,#21 Super Simple Authentication 一个简单的认证实现

在上一篇中,演示了如何根据当前登陆的用户是否具有管理员权限来显示或隐藏指向文章管理的链接。实现方式是通过在ApplicationController中增加一个admin?方法,如果方法返回true则显示,否则隐藏这些链接。接下来是如何实现这个方法的逻辑,应该是根据登陆用户的情况决定是否显示。

有多种实现方法

可以通过多种方式来实现一个登陆系统。可以从模型到界面自己开发一套,当然可以借助于一个名为acts_as_authenticated1的权限管理插件。它的RESTFUL版本叫做restful_authentication。安装好之后,可以用如下方法生成代码:


$script/plugin install git://github.com/technoweenie/restful-authentication.git restful_authentication
$script/generate authenticated User sessions
$rake db:migrate

关于restful_authentication插件将在episode 67中进行详细介绍。

登陆系统开发完毕后,在admin?方法中得到当前登陆的用户,判断其用户名是否在你的管理员列表中。或者给每一个用户增加一个是否是管理员这样一个属性等。

不过我们的这个站点本来就不太复杂,也用不上那么完善的权限管理机制。其实只要能区分出是普通用户还是管理员用户就足够了,所以不打算加入权限管理模块。最最简单的实现是检查请求过来的IP是不是服务器本机IP。

def admin
  request.remote_ip == "127.0.0.1"
end

很明显这个实现方案太过简陋了,管理工作只能在服务器本机完成。我想还是做一张简单的登陆页面,接受一个密码作为参数,如果密码正确就显示管理员链接。

RailsCasts中文版,21 Super Simple Authentication 一个简略的认证实现

简单的登陆页面。

创建一个名为SessionsController的控制器类,代码如下:

class SessionsController < ApplicationController
  def new
  end

  def create
    session[:password] = params[:password]
    flash[:notice] = ’Successfully logged in’
    redirect_to home_path
  end
  
  def destroy
    reset_session
    flash[:notice] = ’Successfully logged out’
    redirect_to login_path
  end
end

还有登陆页面,位于/views/sessions目录中。

<% form_tag sessions_path do %>
  Password: <%= password_field_tag :password %>
  <%= submit_tag "Login" %>
<% end %>

页面提交请求后会调用SessionsController中的create方法,保存密码至会话中,然后转向列表页面。之后admin?方法将会话中存储的密码取出并校验,返回是否通过。

def admin?
  session[:password] == "secret"
end

完工!

你要问了,如何将登录动作与create方法关联,以及如何将注销动作与destory方法关联的呢?秘密就在routes.rb中。

map.connect 'login', :controller => 'sessions', :action => 'create'
map.connect 'logout', :controller => 'sessions', :action => 'destroy'

功能一切正常,并没有太过复杂的用户认证系统支持,但对我们来说是足够用了。

注:

  1. http://github.com/technoweenie/restful-authentication/tree/master


作者授权:Your welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.

原文链接:http://railscasts.com/episodes/21-super-simple-authentication