Rails学习笔记之Typo登陆认证与授权
只是写出自己觉得不错的看点,供新手参考. 由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
功能不是很强大,但满意一般的小应用场合.