【问题标题】:Authenticate active admin user in grape api endpoint在葡萄 api 端点中验证活动管理员用户
【发布时间】:2017-02-16 16:27:01
【问题描述】:

这是我的应用程序的组件

管理面板位于 myapp.com/admin 上,由活动管理员构建。然后我在dashboard.myapp.com 上有一个用AngularJs 构建的用户仪表板,然后我在myapp.com/api 有一个用grape 构建的api。

我的管理面板上有一项功能,管理员可以在仪表板上以其他用户的身份登录。我们称之为 capture_session。基本上用户会话由管理员捕获,我们删除一个 cookie admin_capture,其值为 admin_user 的 id。

现在这就是我想要实现的目标。在我的一个葡萄 api 端点中,我需要验证会话是否被捕获,并且捕获会话的管理员用户也已登录管理面板。

现在确定会话是否被捕获很容易,因为我已经有一个 cookie。但是如何验证管理员用户是否已登录? 由于无法在葡萄 api 端点中调用活动的管理方法和助手。 我可以通过 cookie 或会话来实现这一点吗?任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: ruby-on-rails cookies activeadmin session-cookies grape-api


    【解决方案1】:

    这就是我解决这个问题的方法.. 我使用加密会话设置了另一个 cookie admin_session,然后从仪表板返回与标题相同的 cookie。

    在葡萄端点中,我解密了会话并获得了管理员用户的 ID 和加密密码的初始部分。并使用此信息验证管理员。

    这里是代码。

      admin_id      = ADMIN_ID_HEADER
      admin_session = ADMIN_SESSION_HEADER
      admin_user    = AdminUser.find_by_id(admin_id)
      return unless admin_id.present? && admin_session.present? && admin_user.present?
    
      salt          = Rails.application.config.action_dispatch.encrypted_cookie_salt
      signed_salt   = Rails.application.config.action_dispatch.encrypted_signed_cookie_salt
      key_generator = ActiveSupport::KeyGenerator.new(ENV['SECRET_KEY_BASE'], :iterations => 1000)
      secret        = key_generator.generate_key(salt)
      signed_secret = key_generator.generate_key(signed_salt)
      encryptor     = ActiveSupport::MessageEncryptor.new(secret, signed_secret, :serializer => ActiveSupport::MessageEncryptor::NullSerializer)
      session_data  = JSON.parse(encryptor.decrypt_and_verify(CGI::unescape(admin_session))) rescue {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多