只是写出自己觉得不错的看点,供新手参考. 由ApplicationController统一include LoginSystem module. 代码放在目录vendor/plugins/typo_login_system

小技巧一: vendor/plugins/typo_login_system/lib/login_system.rb

def self.included(base)
  base.send :helper_method, :current_user, :logged_in?
end

利用include module的回调方法included,把current_user, logged_in?添加到helper,这样在view也可以调用这两个方法 另外它的login_form_系列方法的实现也很值得看.

小技巧二:

def current_user
  @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie || :false)
end
利用   = ,把当前用户保存到实例变量@current_user中,这样控制器实例第二次调用的时候,就不需要再运行后面的代码.

Typo::AccessControl的实现有点复杂,它是yield的常用手法的一个实现
授权基本角色,权限控制细粒度到controller,无法控制到action
从vendor/plugins/typo_login_system/lib/access_control.rb 文件的注释示例进行简单的分析.
类方法map需要传一个Hash,:require的值可以是数组或字符串,这里写角色名,每调用一次类方法,会生成一个Mapper实例,yield后,再把Mapper实例保存到@mappers
而@mappers运行时是唯一的,所以当你多次调用类方法map,把它其生成的所有Mapper实例都保存到@mappers这个数组里.

Mapper数据结构::
Mapper
  –roles
  –controllers
  –project_modules
    –controllers

验证是否可以有权限
通过@mappers拿到包含指定role name的所有Mapper实例,把mapper的controllers和其拥有的所有project_modules的controllers合并成一个数组,判断访问的控制器名是否在此数组里

Typo的角色权限定义可以看config/initializers/access_rules.rb

功能不是很强大,但满意一般的小应用场合.