应用程序之间的Padrino身份验证,使用例如:logged_in?

 longyuyuyu 发布于 2022-12-31 14:48

我正在关注Padrino的博客教程,现在我遇到了我有两个应用程序的问题:管理员,应用程序和我不知道如何访问来自App内部管理员的经过身份验证的帐户.例如,在views/posts/show.haml里面我希望能够使用logged_in吗?帮助器,但它总是返回false,因为我怀疑必须以其他方式访问current_account变量.我错过了什么?

# admin/app.rb
 module MyCompany
  class Admin < Padrino::Application
    use ActiveRecord::ConnectionAdapters::ConnectionManagement

    register Padrino::Mailer
    register Padrino::Helpers
    register Padrino::Admin::AccessControl

    set :admin_model, 'Account'
    set :login_page,  '/sessions/new'

    enable  :sessions
    disable :store_location

    access_control.roles_for :any do |role|
      role.protect '/'
      role.allow   '/sessions'
    end

    access_control.roles_for :admin do |role|
      role.project_module :posts, '/posts'
      role.project_module :accounts, '/accounts'
    end

    # Custom error management
    error(403) { @title = "Error 403"; render('errors/403', :layout => :error) }
    error(404) { @title = "Error 404"; render('errors/404', :layout => :error) }
    error(500) { @title = "Error 500"; render('errors/500', :layout => :error) }
  end
end

# app/app.rb
module MyCompany
  class App < Padrino::Application
    use ActiveRecord::ConnectionAdapters::ConnectionManagement

    register SassInitializer
    register CompassInitializer
    register Padrino::Mailer
    register Padrino::Helpers
    register Padrino::Assets
    register Padrino::CSRF

    configure :production do
      set :js_compressor, Uglifier.new(mangle: false)
      set :css_compressor, :yui
      set :precompile_assets, [/^\w\.(?!(?:css|js)$)/i]
    end
    configure :test do
      set :raise_errors, true
      set :show_exceptions, false
    end

    enable :sessions
    enable :prevent_request_forgery

    # Don't blow up when we can't find something
    error ActiveRecord::RecordNotFound do
      halt 404
      render 'errors/404'
    end

    error 404 do
      render 'errors/404'
    end

    error 500 do
      render 'errors/500'
    end

  end
end


更新:

最后,我找到了一个解决方法,它通过为两个应用程序共享相同的值来覆盖session_id,以便帮助程序方法找到相同的登录帐户:

Padrino.configure_apps do
  enable :sessions
  set :session_secret, 'mycustomsessionsecret'
  set :protection, :except => :path_traversal
  set :protect_from_csrf, true
  ## here starts the change, I assume first_app to be 'Admin'
  first_app = Padrino.mounted_apps.first
  if first_app
    set :session_id, "#{first_app.app_obj.session_id}"
  end
end

每个处理身份验证助手的应用都必须包含此模块:

register Padrino::Admin::AccessControl

如果有更好的解决方案,我很高兴听到它,但这对我有用.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有