rails+devise+cancancan+rolify注册登录多角色权限管理

2023-10-19 15:40

本文主要是介绍rails+devise+cancancan+rolify注册登录多角色权限管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mac环境

Ruby 2.4.1

Rails 5.1.2

 

进入正题,本章主要是解决多角色权限问题,使用 devise 、 cancancan 、rolify 。 

注:所有 $ 开头的都是终端里输入的,其它都是项目里面的文档加入的。

1、先创建好新的项目

$ rails new demo

  

2、打开Gemfile,加入以下gem

gem 'devise'
gem 'cancancan'
gem 'rolify'

  

3、进入项目文件侠里

$ cd demo

  

4、安装刚刚加入的gem

$ bundle install

  

5、安装devise

$ rails g devise:install

  

6、打开config/environments/development.rb 文件,在里面输入

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

  

7、打开 config/routes.rb,在里面输入

root to: "home#index"

  

8、打开app/views/layouts/application.html.erb 文件,在<%= yield %>前面加入以下代码:

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

  

9、在终端输入以下代码:

$ rails g devise:views

  

10、现在添加一个提前routes.rb里提到的home目录和index文件,在终端执行以下代码:

$ rails g controller home index

  

11、在终端输入以下代码:

$ rails g devise user

    

12、创建一个list列表,这个list是用scaffold(脚手架)直接产生出来,在终端下输入以下代码:

$ rails g scaffold list name idcard phone

  

13、在终端下输入以下代码:

$ rails db:migrate

 

 14、打开app/controllers/lists_controller.rb 和 app/controllers/home_controller.rb,把以下代码输入相应的位置:

before_action :authenticate_user!

  注:这个是Devise的提供的方法,验证登录后才能打开这个list页面

 

15、增加一个注册登录的导航,按下方法操作,打开app/views/layouts/application.html.erb,在<%= yield %>前面输入以下代码:

<% if current_user %><%= link_to('退出', destroy_user_session_path, :method => :delete) %> |<%= link_to('修改密码', edit_registration_path(:user)) %><% else %><%= link_to('注册', new_registration_path(:user)) %> |<%= link_to('登录', new_session_path(:user)) %>
<% end %>

  

16、接下来集成cancancan、rolify

$ rails generate cancan:ability
$ rails generate rolify Role User

  

 17、打开db/migrate/20171217141406_rolify_create_roles.rb,在最后加上[5.1]这个参数,前面20171217141406这个时间戳与你的不一样。

class RolifyCreateRoles < ActiveRecord::Migration[5.1]

  

 18、在终端下输入以下代码:

$ rails db:migrate

  

19、打开app/controllers/application_controller.rb,输入以下代码:

class ApplicationController < ActionController::Baseprotect_from_forgery with: :exceptiondef after_sign_in_path_for(resource)if resource.is_a?(User)if User.count == 1resource.add_role 'admin'endresourceendroot_pathend
end

  注:以上代码是设置第一个注册用户id=1时为admin管理员,当id=2时就不是admin,当我注册第一个用户后我就把1改成2,admin改成user,那注第2个账号时就是user权限 ,待会user做一个比admin还低一级的权限。

 

20、打开app/models/ability.rb,输入以下代码:

class Abilityinclude CanCan::Abilitydef initialize(user)if user.has_role? :admin  #这里的admin权限等级最高,能增删改查。can :manage, :allelsif user.has_role? :user  #这里的user权限等级次于admin,能增改查,没有删除功能。can :manage, :allcannot :destroy, :all  #这里就是去掉删除功能。elsecan :read, :all    #else之后的用户只有只读功能。endend
end

注:上面图片内容截图于http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-3/

 

21、打开app/controllers/lists_controller.rb,增加以下代码:

class ListsController < ApplicationControllerload_and_authorize_resource  #这个是cancancan全局权限验证的方法before_action :authenticate_user!  #这个是devise的登录验证方法

  注:这里有 load_and_authorize_resource 

 

22、打开app/controllers/application_controller.rb,增加以下代码:

rescue_from CanCan::AccessDenied do |exception|redirect_to lists_path , :alert => exception.messageexception.action, exception.subject
end

  注:如果权限认证失败,cancan会抛出一个CanCan::AccessDenied的异常,你可以在ApplicationController中捕获它来显示自己内容。这里引用了https://www.cnblogs.com/bendanchenzhicheng/archive/2011/09/05/2167451.html

 

23、打开app/views/layouts/application.html.erb,增加以下代码:

<!DOCTYPE html>
<html><head><title>Demo</title><%= csrf_meta_tags %><%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %><%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %></head><body><div class="container"><div class="col-md-12"><%= link_to '首页', root_path %> |<% if current_user %>Welcome come <%= current_user.email %><%= link_to '退出', destroy_user_session_path, :method => :delete %> |<%= link_to '修改密码', edit_registration_path(:user) %><% else %><%= link_to '注册', new_registration_path(:user) %> |<%= link_to '登录', new_session_path(:user) %><% end %><p class="text-danger"><%= alert %></p><%= yield %></div>
</div></body>
</html>

  

23、打开 app/views/home/index.html.erb,增加以下代码:

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p><% if user_signed_in? %><%= link_to "Lists", lists_path %><% end %>

  

24、打开app/views/lists/index.html.erb,增加以下代码:

<h1>Lists</h1><table class="table table-bordered"><tr><th>Name</th><th>Idcard</th><th>Phone</th><% if can? :manage, @list %><th colspan="3"></th><% end %></tr><% @lists.each do |list| %><tr><td><%= list.name %></td><td><%= list.idcard %></td><td><%= list.phone %></td><% if can? :manage, @list %><td><%= link_to 'Show', list %></td><td><%= link_to 'Edit', edit_list_path(list) %></td><% if can? :destroy, @list %><td><%= link_to 'Destroy', list, method: :delete, data: { confirm: 'Are you sure?' } %></td><% end %><% end %></tr><% end %></table>
<% if can? :create, @list %>
<%= link_to 'New List', new_list_path %>
<% end %>

  

25、按以上的操作基本实现了三角色权限管理,现在我们打开终端,在项目内,输入rails s,启动服务器,打开浏览器,输入http://localhost:3000,就正常显示一个Log in的页面。现在我们注册一个具有admin权限的账号;成功后,到回第19项操作,把1改成2,把admin改成user,保存,我们再注册一个具有user权限的账号,注册成功后,马上到回第19项操作,注释掉以下代码:

  # def after_sign_in_path_for(resource)#       if resource.is_a?(User)#         if User.count == 2#           resource.add_role 'user'#         end#         resource#       end#       root_path#   end

  

 

好了,我们现在有2个账号,一个是admin的,一个是user的。然后把上面这个功能注释后,以后注册的都是只有read功能的账号。

ok,完成。

 

转载于:https://www.cnblogs.com/roy0524/p/8053502.html

这篇关于rails+devise+cancancan+rolify注册登录多角色权限管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240762

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主