<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>fanix</title>
    <description>Ruby and Rails 爱好者。</description>
    <link>http://fanix.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>用restful_authentication和role_requirement搭建验证授权系统</title>
        <author>fanix</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fanix.javaeye.com">fanix</a>&nbsp;
          链接：<a href="http://fanix.javaeye.com/blog/177508" style="color:red;">http://fanix.javaeye.com/blog/177508</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用rails做验证和授权系统并不复杂，但通过安装插件的方式可以减少重复劳动。<br /><span style="color: #FFA500"><strong>restful_authentication</strong></span>是一个验证系统，支持rails2.0，提供了简单的用户注册登录注销、简单的验证等功能。<br /><span style="color: #D2691E"><strong>role_requirement</strong></span>是授权系统，能和restful_authentication很好的结合，该插件提供了授权的基本实现。<br /><br /><strong>安装和配置：</strong><br />步骤1：安装restful_authentication<br />命令行下： <br /><br />ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/<br />ruby script/generate authenticated user sessions<br /><br />第一步是安装插件。第二步生成文件，里面的user代表生成的模型的名称，可选–include-activation参数决定是否生成向新注册用户发送激活码的代码。<br /><br />步骤2：安装role_requirement<br /><br />ruby script/plugin install http://rolerequirement.googlecode.com/svn/tags/role_requirement/<br />ruby script/generate roles Role User<br /><br />第一步安装插件，第二步是生成文件结构并设置角色和用户之间的多对多关系。<br /><br />这样，两个插件就基本安装配置完了，还需要修改一些东西：<br /><br />1、由于一开始生成的restful_authentication的模型是user，在user.rb模型文件里，注释掉“attr_protected :roles”，因为会和“attr_accessible”发生冲突（这两个方法是黑名单和白名单的作用，只能用一个）。<br /><br />2、可以在路由配置里加入：<br /><pre name="code" class="java">map.signup '/signup', :controller => 'users', :action => 'new'
map.login '/login', :controller => 'sessions', :action => 'new'
map.logout '/logout', :controller => 'sessions', :action => 'destroy'</pre><br />然后在模板里加入：<br /><pre name="code" class="java">&lt;% if logged_in? %>   
  &lt;p>&lt;strong>你以&lt;%=h current_user.login %>的身份登录&lt;/strong>&lt;/p>
  &lt;p>&lt;%= link_to '注销', logout_path %>&lt;/p>
&lt;% else %>
  &lt;p>&lt;strong>你还没有登录。&lt;/strong>&lt;/p>
  &lt;p>
    &lt;%= link_to '登录', login_path %> or
    &lt;%= link_to '注册', signup_path %>
  &lt;/p>
&lt;% end %></pre><br />看，我们的验证插件已经很好工作了。<br /><br />注：如果需要更强大验证功能，可查看：http://www.rubyplus.org/episodes/20-Extended-RESTful-Authentication-Rails-2-App.html，这个增强版的插件包含了邮件激活、修改密码、忘记密码等功能。但是修改密码和忘记密码存在安全隐患，请修改后使用。<br /><br />3、由于role_requirement插件生成的文件不全，可以用scaffold命令重新生成role的缺失文件。在role.rb里加上了has_and_belongs_to_many :users。scaffold好后，添加一个新的角色“admin”，然后通过调用“role.users”来给“admin”添加成员。这样我们就可以来使用require_role方法来授权，这个方法比较强大。<br /><br />如在控制器前添加：<br /><pre name="code" class="java">require_role "admin"</pre><br /><br />注意：如果需要在Role和User的连接表添加更详细的内容，则不适合使用roles_users连接表，可新建模型并通过through方法连接User和Role。
          <br/>
          <span style="color:red;">
            <a href="http://fanix.javaeye.com/blog/177508#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 02:08:39 +0800</pubDate>
        <link>http://fanix.javaeye.com/blog/177508</link>
        <guid>http://fanix.javaeye.com/blog/177508</guid>
      </item>
  </channel>
</rss>