在上一篇中,演示了如何根据当前登陆的用户是否具有管理员权限来显示或隐藏指向文章管理的链接。实现方式是通过在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'
作者授权: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