백그라운드 관리 권한 제어

6689 단어 권한 제어
최근에 새로운 프로젝트를 시작하려고 합니다. ror로 실현하고 프레임워크를 잘 구축해야 합니다. Let's coding!나의 프로젝트 명칭 규칙은 백엔드 관리의 컨트롤러는 마이너스 형식을 통일적으로 사용하고 백엔드는 단수이다. 이런 코드는 비교적 규범화되고 이의성이 없다.전역 필터 로그인이 필요한지 판단needlogin? Applicationcontroller.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은 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
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기