2013-01-15 78 views
3

我安装了清漆,一切正常。清漆 - 如何缓存登录用户

但是,我需要缓存登录用户。这是我在我的VCL中所拥有的:

backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    unset req.http.Cookie;  
    if (req.http.Authorization || req.http.Cookie) { 
     return (lookup); 
    } 
    return (lookup); 
} 

sub vcl_fetch { 
    unset beresp.http.Set-Cookie; 
    set beresp.ttl = 24h; 
    return(deliver); 
} 

上述工作,但用户可以查看其他用户的数据,例如假设我以Sam的身份登录并访问了页面A.当另一个用户Angie登录并打开页面A时,她看到的内容与Sam相同。

有没有一种方法可以将页面限制为实际被授权查看该页面的登录用户?

我的请求头如下:

Request Headersview source 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Authorization Basic YWRtaW46YWRtaW4= 
Connection keep-alive 
Cookie tree-s="eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuRKCECUjWFEnWIyIdJGvGlQgEegAD3hAj"; __ac="0zVm7PLtpaeQUXtm9BeYrC5%2BzobmBLPQkjRtxjyRGHs1MGY1MTgzZGFkbWluIQ%3D%3D"; 'wc.cookiecredentials'="0241d135445f7ca0b1cb7aced45da4e750f5414dadmin!" 

我可以使用Authorization项的请求头实施这一限制?

回答

3

你的VCL目前正在做的是从请求头中删除Cookie并缓存所有请求。这会导致您描述的确切行为:第一页加载被缓存,并且所有后续用户都获取缓存的内容 - 无论是谁发出请求。通常,您只想为尚未登录的用户缓存内容。

您无法使用Varnish进行授权或访问控制。这需要由后端处理。为了做到这一点,您需要识别包含相关会话信息的cookie,并在定义会话时保留cookie,并在其他情况下放弃Cookie。

例如:

sub vcl_recv { 
    if(req.http.Cookie) { 
    # Care only about SESSION_COOKIE 
    if (req.http.Cookie !~ "SESSION_COOKIE") { 
     remove req.http.Cookie; 
    } 
    } 
} 

这种方式包含一个“会话cookie”曲奇所有请求都将通过到后端传递,而没有登录用户光油接收缓存副本。

如果您希望使用Varnish进行缓存登录用户,我建议你看看Varnish's ESI features

+1

这样做可以在网页本身没有任何修改,即esi标签,只是通过VCL做到这一点? – Frankline

+0

对于ESI,您需要大幅改变页面。就cookie而言,如果您的网页只为已登录并在退出时(或会话过期)清除的用户设置了Cookie,则可以在我的答案中使用VCL(根据您的需要进行修改),以便删除多余的Cookie。 – Ketola

0

它可以通过VCL只能做 - 与另外一个VMOD或内嵌C.

一个简单的例子: 比方说,你有三个不同层次用户的三个不同的网页:(未登录,登录后,管理员),关卡存储在cookie中。你可以把cookie值和一个GET参数添加到URL:

http://example.com/homepage.html?user_level=none

http://example.com/homepage.html?user_level=logged_in

http://example.com/homepage.html?user_level=admin

(你VMOD将处理中添加或 '&' 和 '?'名称值对到URL的末尾)。

所有这一切通常会在vmod中完成,但也可以根据大小完成,如inli ne C. Vmods是首选,但内联C可以让你启动并运行初始测试 - 然后移动到vmod。

当vcl_hash()运行时,它会散布在刚刚修改的url上。现在,清漆缓存将包含最多三个不同版本的页面。从Varnish的角度来看,这些是三种不同的缓存对象。您可以为页面的每个变体设置不同的TTL。

在高速缓存未命中时,后端Web服务器可以忽略刚添加的此获取参数,也可以在vcl_hash()或vcl_backend_fetch中将其删除。您的后端服务器通常会使用cookie值而不是此vcl添加的参数。

总之,您正在修改URL参数,以便为您需要的不同用户级别使用不同的哈希值。或者,你可以改变你的vcl_hash()方法来代替cookie值,但是我发现改变URL更好的varnishncsa日志和报告。另外,如果cookie被加密,那么只需修改URL参数,就可以使用基本cURL请求更轻松地处理PURGE请求。如果发送PURGE请求的客户端是授权用户,您的PURGE条件将会处理。