最近要开始一个新的项目,用ror来实现,把框架搭建好,Let's coding!
我的项目命名规则是,后台管理的的控制器统一用负数形式,前台则是单数,这样的代码看起来比较规范,无二义性。
全局过滤器判断是否需要登陆need_login? 放在application_controller.rb中
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :need_login?
private
def need_login?
controller_name = params[:controller]
if controller_name.pluralize ==controller_name
if session[:adminer].blank?
flash[:notice] = "请先登录"
redirect_to "/admins"
end
else
if session[:officex].blank?
flash[:notice] = "请先登录"
redirect_to "/"
end
end
end
end
登陆和退出action放在admins_controller下
def login
sys_user = SysUser.find_by_name_and_password(:name => params[:name], :password => SysUser.encrypted_pwd(params[:password))
if sys_user.blank?
flash[:notice] = "账号或密码错误"
redirect_to "/admins"
else
session[:adminer] = sys_user
redirect_to "/admins/admin"
end
end
def logout
reset_session
redirect_to "/admins"
end
下午新建了一个Sys_menus的数据表,用来后台菜单的显示,以前是写死的,现在用数据库的方式,就可以自己维护了
sys_menus的字段有action_name,action_url,parent_id,sort
使用方法:在admins_helper.rb中添加两个方法get_permission 和 is_visual
#返回当前用户的权限值
def get_permissions
sys_user = SysUser.find session[:adminer][:id]
sys_use_permission = []
sys_user.sys_roles.each do |r|
role_permission = []
r.sys_action_permissions.each do |p|
role_permission << p.permission_value
end
sys_user_permission = sys_user_permission + role_permission
end
sys_user_permission
end
#判断是否显示,如果是superuser则跳过
def is_visual value
session[:adminer][:name]=="superuser" or get_permissions.uniq.include?(value)
end
admins_controller.rb
def nav
@parents = SysMenu.where("parent_id=0").order("sort DESC").all
@actions = SysMenu.where("parent_id!=0").order("sort DESC").all
render :layout => false
end
nav.rhtml
<% @parents.each do |p| %>
<label><%= p.action_name%></label>
<ul>
<% @actions.each do |a| %>
<% next if a.parent_id != p.id %>
<% if is_visual(a.action_url)%><li><a href="<%=a.action_url%>"><%=a.action_name%></a></li>
<%end%>
<%end%>
</ul>
怎么样才能让权限控制更加flexible呢?
在sys_roles_controller.rb中加入refresh_permission
#只有superuser才可以调用
def refresh_permission
if session[:adminer].name != "superuser"
render :text => "Sorry! You are not allowed."
return
end
SysActionPermission.create_all_permissions
end
重点就在这里拉,create_all_permissions的实现
def self.create_all_permissions
require "find"
root = SysActionPermission.find_by_parent_id(0)
root = SysActionPermission.create({:permission_name=>"根节点",:permissionvalue=>"/",:parent_id=>0,:sort=>100}) if root.blank?
dir = File.expand_path(Rails.root) + "/app/controllers"
actions = []
Find.find("#{dir}/") do |path|
Find.prune if path =~ /.svn/ #过滤一些目录下不需要的文件
if File.file?(path) and path.end_with?("_controller.rb") and path.end_with?("admins_controller.rb")
parent_name = path.sub(dir,'').sub('_controller.rb','')
if parent_name == parent_name.pluralize
parent = SysActionPermission.find_by_permission_value_and_parent_id(parent_name, root.id)
obj = eval(ActiveSupport::Inflector.camelize(path.sub(dir, '').sub('.rb',''))).new
#若二级权限已存在则不创建
parent = SysActionPermission.create(:permission_name => "#{parent_name}", :permission_value => "#{parent_name}", :parent_id => root.id) if parent.blank?
parent_id = parent.id
all_public_methods = obj.public_methods(false)
for action_name in all_public_methods
#若已存在则不创建
value = "#{parent_name}/#{action_name}"
if(SysActionPermission.find_by_permission_value_and_parent_id(value, parent_id).blank?)
actions << {:permission_name => "#{value}", :permission_value => "#{value}", :parent_id => parent_id}
end
end
end
end
end
SysActionPermission.create(actions.uniq)
all_has_created_permissions = SysActionPermission.all
for permissrions in all_has_created_permissions.compact
next if permissrions.parent_id == 0
#查看控制器存在与否
if permissrions.permission_value.count("/") == 1
if !File.exist?(File.expand_path(Rails.root) + "/app/controllers" + permissrions.permission_value + "_controller.rb")
ActiveRecord::Base.connection.execute("DELETE FROM sys_action_permissions WHERE parent_id = #{permissrions.id} or id = #{permissrions.id}")
end
elsif permissrions.permission_value.count("/") == 2
controller = permissrions.permission_value.split("/")[1] + "_controller"
action = permissrions.permission_value.split("/")[2]
begin
public_methods = eval(ActiveSupport::Inflector.camelize(controller)).new.public_methods(false)
if !public_methods.include?(action.to_sym)
permissrions.destroy
end
rescue => e
p e
end
end
end
end
分享到:
相关推荐
后台管理权限控制 菜单控制、界面控制、按钮控制
2.实现管理员登陆注册权限控制 3.实现菜单栏菜单增删查改功能 4.实现后台权限配置页面 5.EASYUI左侧栏和选项卡效果 不同权限的管理员登录进去 只能看到自己有权限的菜单 如果直接通过url地址访问没有权限的菜单是不...
基于Vue和element-ui组件库搭建的一个后台管理系统。主要讲的是关于后台管理系统权限控制问题,包括:菜单控制、界面控制、按钮控制、请求和响应控制。
第一个文件是不假shiro的 第二个是加shiro的 附带sql脚本
后台权限管理系统,角色,菜单,按钮权限控制
最新SpringBoot框架后台管理模板 本SpringBoot框架采用零xml配置,全部动态启动、支持热部署 框架结构清晰明了! 框架管理:maven 框架: 1.核心框架---------Spring-boot 2.数据源框架-------mybatis、HikariCP...
是一个简单高效的后台权限管理系统。...安全框架采用时下流行的Apache Shiro,可实现对按钮级别的权限控制;前端页面使用Bootstrap构建,主题风格为时下Google最新设计语言Material Design,并提供多套配色以供选择。
vue后台管理项目权限控制开发雏形,使用自定义指令和路由守卫 权限控制 vue后台管理端 博客https://blog.csdn.net/github_35631540/article/details/97674939
springboot+shiro+layuimini实现后台管理系统的权限控制
该项目主要展示 RBAC 的权限控制效果,并提供员工管理模块以供测试。用户登录系统后,根据用户所关联的角色,查询角色拥有的权限,如:菜单权限、按钮权限。不同角色的用户,所显示的菜单可能也不尽相同。 系统...
通过读取代码注释的方式控制权限,实现后台最细化的权限管理,这是一种思路,读取代码注释的方式也可以用在别的地方,可以有效的简化各种复杂的定义,资源里面附带了表
springboot角色权限后台管理系统脚手架实战开发教程包含完整源码系统实现的功能主要有用户管理、角色管理、权限管理、日志管理、数据库备份等等,涉及的知识点有:springboot框架原理、freemark模板标签语法、jpa...
struts2 spring mybatis easyui 权限管理系统 加博客前台页面管理
java后台权限管理系统源码(spring boot+mvc+mybatis)。 项目是maven,相应的jar包也在压缩包里。项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器)...
一套完整的后台管理系统,创建数据库后可直接运行maven工程 账号:admin,密码:123456
easyui后台管理系统,包括菜单权限,按钮权限,后台使用springMVC+hibernate,mysql数据库,jsp
安全框架采用Spring Security 5.0.7,可实现对按钮级别的权限控制,并集成了社交账户登录(QQ和微信)以及手机验证码登录;前端页面使用Bootstrap构建,主题风格为时下Google最新设计语言Material Design,并提供多...
项目概述:本源码为基于角色基础访问控制(RBAC)模型的中小型应用开发平台,采用前后端分离架构。...该平台为开发人员提供了一个具有完善权限控制的后台管理系统,支持快速开发具有复杂权限需求的中后台应用。
基于 RBAC 的 Net6 后台管理框架,权限管理,前后台分离,支持多站点单点登录,兼容所有主流浏览器,内置微信、支付宝、QQ等多种登录方式,内置多种样式,可切换至 Blazor 多 Tabs 模式,权限控制细化到网页内任意...
引入角色这个概念,可以帮助我们灵活的扩展,使一个账号可以具备多种角色。功能权限控制功能权限定义:为可见、可以操作的功能范围。在目录、菜单上加权限控制,有权限的就