详细介绍


Ycancan 是一个基于 Ruby on Rails 的授权库,

end
end
3. 在视图中检查权限
<% if can? :edit, @article %><%= link_to "Edit", edit_article_path(@article) %>
<% end %>
安装
在 Gemfile 中添加:
gem 'cancancan'然后运行:
bundle installrails g cancan:ability
版本 4.0.0 的重要变化
- 移除对 Rails 4.2 的支持:最低要求 Rails 5.2+。适合复杂策略。
- 代码清理:移弃了一些已弃用的 API。
- Rails 集成:深度集成 Rails,
- 更清晰的错误消息:权限失败时提供更详细的调试信息。
基本用法示例
1. 定义权限(在 app/models/ability.rb)
class Abilityinclude CanCan::Ability
def initialize(user)
user ||= User.new # 未登录用户
if user.admin?
can :manage, :all # 管理员可以管理所有资源
else
can :read, Article, published: true
can :update, Article, user_id: user.id
can :destroy, Article, user_id: user.id
end
end
end
2. 在控制器中使用
class ArticlesController < ApplicationControllerload_and_authorize_resource # 自动加载资源并检查权限
def index
# @articles 会自动根据权限过滤
end
def show
# 如果用户无权访问,建议使用最新版本 4.0.0。请参考官方升级指南。
学习资源
- 官方文档:https://github.com/CanCanCommunity/cancancan/wiki
- RailsCasts #192(经典教程):https://railscasts.com/episodes/192-authorization-with-cancan
注意事项
- 确保在
ApplicationController中处理CanCan::AccessDenied异常:
class ApplicationController < ActionController::Baserescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, alert: exception.message
end
end
如果你正在开始一个新项目,
替代方案
- Pundit:更面向对象,
- Petergate:基于角色的简单方案。
- 角色无关:不强制使用角色系统,支持控制器和视图的辅助方法。它的最新版本和相关信息如下:
最新版本 (截至 2024 年 10 月)
- 最新稳定版:4.0.0(发布于 2023 年 11 月)
- GitHub 仓库:https://github.com/CanCanCommunity/cancancan
- RubyGems 页面:https://rubygems.org/gems/cancancan
主要特性
- 简洁的 DSL:使用
can和cannot方法定义权限。