0

ユーザーごとに、Beegoアプリは/static/users/次の形式でディレクトリを作成します: /static/users/USER_ID/privateand /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

フィルターには別の挿入ポイントがあるようですが、 http://beego.me/docs/mvc/controller/filter.mdbeego.BeforeStaticには記載されていません。

https://github.com/astaxie/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 に答える