即使在/注销代码在Sinatra中运行后,Rack.session cookie也不会被删除

时间:2014-12-22 17:59:19

标签: ruby authentication ldap sinatra session-cookies

我在Ruby中开发了一个非常简单的Sinatra身份验证系统,当用户将应用程序的URL放入浏览器时,会向用户显示一个浏览器表单。然后他们输入他们的登录详细信息,如果这些是正确的,则允许他们进入限制区域。

我的问题是,即使我这样做: -

        get '/logout' do

            session[:session_id] = nil
            current_user = false

                File.open(LOG_FILE, "a"){ |f| f.puts "Session closed... #{current_user}" } 


        end 

当我使用Chrome浏览器开发工具执行检查元素时,我仍然可以看到机架会话cookie。我希望cookie被删除而且它没有。现在的缺点是,当我输入应用程序的URL时,我不再提供浏览器表单,因为Sinatra仍然觉得我仍然登录。

我已经确保,对于我正在使用的任何浏览器,用户名和密码都没有保存,但实际上我希望在将/ logout路由放入浏览器时终止会话并删除co​​okie。

有人可以告诉我我需要做什么吗?我添加了authenticate方法和/ route的代码。

get '/' do 
            begin

                authenticate


                session[:username] = @auth.credentials[0]

                current_user = session[:username]
                File.open(LOG_FILE, "a"){ |f| f.puts " ***session created #{Time.now} #{current_user}" }

                erb :index
            rescue Exception => err
                File.open(LOG_FILE, "a"){ |f| f.puts " ***Daemon failure #{Time.now} err=#{err} " }
                File.open(LOG_FILE, "a"){ |f| f.puts " ***Daemon failure #{Time.now} err=#{err.backtrace.join("\n")} " }
            end

        end

authenticate.rb

def authenticate         如果授权,则返回true?         headers ['WWW-Authenticate'] ='Basic realm =“Restricted Area”'         停止401,“未授权\ n”     端

def authorized? 
    @auth ||=  Rack::Auth::Basic::Request.new(request.env)
    @auth.provided? and @auth.basic? and @auth.credentials and is_authenticated_by_ldap(@auth.credentials) 
end

def is_authenticated_by_ldap(凭据)

      EXTENSION = @praetor.qube 
      full_username = credentials[0] + EXTENSION

    ldap = Net::LDAP.new  :host => "just-ln1-wdc03.praetor.qube", # your LDAP host name or IP goes here,
                           :port => 389, # your LDAP host port goes here,
                      #:encryption => :simple_tls,
                           :base => "DC=praetor,DC=qube", # the base of your AD tree goes here,
                           :auth => 
                      {
                            :method => :simple,
                            #:username => credentials[0],
                            :username => full_username, # a user w/sufficient privileges to read from AD goes here,
                            :password => credentials[1] # the user's password goes here
                        }   

    is_authorized = ldap.bind


    return is_authorized
end

1 个答案:

答案 0 :(得分:3)

session.clear将删除会话变量。您仍然会看到Chrome中的会话,因为它是在您的操作运行后由Rack :: Session :: Cookie中间件设置的,但这只是一个空白会话。