백그라운드 관리 권한 제어
6689 단어 권한 제어
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은 adminscontroller 아래
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 필드에 actionname,action_url,parent_id,sort
사용 방법:adminshelper.rb에 두 가지 방법 추가 getpermission 및 isvisual
#
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하게 할 수 있습니까?
sysroles_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
포인트는 여기서 당겨,createall_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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백그라운드 관리 권한 제어최근에 새로운 프로젝트를 시작하려고 합니다. ror로 실현하고 프레임워크를 잘 구축해야 합니다. Let's coding!나의 프로젝트 명칭 규칙은 백엔드 관리의 컨트롤러는 마이너스 형식을 통일적으로 사용하고 백엔드는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.