在上一篇中,演示了如何根据当前登陆的用户是否具有管理员权限来显示或隐藏指向文章管理的链接。实现方式是通过在ApplicationController
中增加一个admin?
方法,如果方法返回true则显示,否则隐藏这些链接。接下来是如何实现这个方法的逻辑,应该是根据登陆用户的情况决定是否显示。
有多种实现方法
可以通过多种方式来实现一个登陆系统。可以从模型到界面自己开发一套,当然可以借助于一个名为acts_as_authenticated
1的权限管理插件。它的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
很明显这个实现方案太过简陋了,管理工作只能在服务器本机完成。我想还是做一张简单的登陆页面,接受一个密码作为参数,如果密码正确就显示管理员链接。
简单的登陆页面。
创建一个名为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'
功能一切正常,并没有太过复杂的用户认证系统支持,但对我们来说是足够用了。
注: