0

对于每个用户,Beego应用程序会在以下格式下创建一个目录/static/users//static/users/USER_ID/private/static/users/USER_ID/public,其中 USER_ID 是每个用户的 ID。

我想保护私人文件,以便只有拥有它们的用户才能使用过滤器进行访问。

路由器中的模式如下:

beego.InsertFilter("/static/users/:userId([0-9]+)/private/*", beego.BeforeRouter, controllers.ProtectPrivateUploads)

过滤器功能如下:

var ProtectPrivateUploads = func(ctx *context.Context) { fmt.Println("Protecting content") }

相关 URL 具有以下形式:

domain.com/static/users/USERID/private/123135645.png

问题是过滤器函数根本没有被调用,所以我假设我一定对路由器中的模式做错了。

任何想法都会受到欢迎。

4

1 回答 1

2

过滤器似乎还有另一个插入点,beego.BeforeStatic但在http://beego.me/docs/mvc/controller/filter.md中没有记录

通过查看https://github.com/ataxie/beego/blob/master/router.go的代码,这些是可以触发过滤器的可接受位置:

const (
    // default filter execution points
    BeforeStatic = iota
    BeforeRouter
    BeforeExec
    AfterExec
    FinishRouter
)

因此,为了触发静态文件过滤器的有效调用可能是:

beego.InsertFilter("/static/users/:userId([0-9]+)/private/*", beego.BeforeStatic, controllers.ProtectPrivateUploads)

更新

beego.BeforeRouter可以使用以下函数获取路由器位置的会话对象:

sess,_ := beego.GlobalSessions.SessionStart(ctx.ResponseWriter, ctx.Request)

因此,保护/static/​​ url 下内容的有效路由器和过滤器将是:

路由器:

beego.InsertFilter("/static/users/:id([0-9]+)/private/*", beego.BeforeStatic, controllers.ProtectPrivateUploads)

筛选:

var ProtectPrivateUploads = func(ctx *context.Context) {
    sess,_ := beego.GlobalSessions.SessionStart(ctx.ResponseWriter, ctx.Request)
    defer sess.SessionRelease(ctx.ResponseWriter)
    ses := sess.Get("sessionid")
    if ses != nil {
       // get user's id from the session and check if the user can access the requested URL
}
于 2015-03-18T18:57:37.493 回答