ruby-on-rails 如何在rails 7中为特定用户设置路线

yiytaume  于 2023-03-04  发布在  Ruby
关注(0)|答案(4)|浏览(158)

我遇到了Rails_admin的问题。Rails_admin已成功添加到应用程序中,并且工作正常。
问题是当我尝试设置路由到特定角色用户时。
我的应用程序由几个角色组成,如用户、客户端、管理员等。我在这里想要的是,只有角色为“管理员”的用户才能使用“link_to 'rails_admin_path'”或http://127.0.0.1:3000/admin访问rails_admin部分。
我已经有了一个管理部分,所以我不想为rails_admin添加任何其他登录部分,只需要在我的管理中添加rails_admin的特性。
我还有一个名为“check_admin”的方法,它将检查current_user的角色是否为admin

current_user.check_admin

路由.rb

Rails.application.routes.draw do
   mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
end

这里我的要求是,给定的路由只能由管理员用户访问
提示:是否存在check_admin或current_user.roles.admin?

fzwojiic

fzwojiic1#

    • 解决方案**

routes.rb

authenticate :user, -> (u) { u.roles.admin.present? } do
  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
end

在检查特定角色的条件下更改路由,在我的情况下是"管理员"。
因此,非管理员的其他用户无论如何都无法访问rails_admin

wa7juj8i

wa7juj8i2#

应要求,扩大我之前的评论...

class AdminController < ApplicationController
  before_action :reject_non_admins

  def index
  end

  def show
  end

# etc... all the admin CRUD actions

private
  def reject_non_admins
    unless current_user.check_admin
      render "unauthorized.html" and return
    end
  end

end

因此,不会阻止非管理员用户访问敏感的管理员页面,而只是向他们显示一个页面,告诉他们不允许查看内容。

# app/views/admin/unauthorized.html

<p>Sorry, only admins can see this page</p>
bqucvtff

bqucvtff3#

路由配置不是阻止非管理员用户访问该页的正确位置。路由配置没有current_user的概念。
应该在控制器中完成。

def show
  unless current_user.roles.admin.present?
    render "unauthorized"
  end
  # default "show.html will render
end
drnojrws

drnojrws4#

我很确定这就是约束的作用
https://guides.rubyonrails.org/routing.html#advanced-constraints.
https://www.mikewilson.dev/posts/rails-vanity-urls-with-route-constraints/
我们可以在用户的路由上使用Route Constraint,这样,如果路由的:id与系统中的用户名不匹配,则返回false,Rails继续下一个路由。
Explain about Route Constraint Rails
基本上是这样的

lib/role.rb

class Roles   
    def initialize(&block)
       @block = block || lambda { |user| true }  
    end
        
     def matches?(request)
      user = current_user(request)
      user.present? && @block.call(user)  
     end
        
    def current_user(request)
#my users cookies are stored in A model called ActiveSessions
#what ever your Session cookies is goes here
      active = ActiveSession.find_by(id: 
       request.session[:current_active_session_id])
#then find user from that cookie
     User.find_by_id(active.user.id)   
    end 
end

然后在路由中:

constraints Roles.new { |user| user.roles == "ROLE" } do
#what ever routes you want access to based on constraint
end

注意ROLE是您希望根据列属性给予访问权限的角色;即管理员、成员、客户端等

相关问题