我正在尝试在golang平台上使用google-app-engine进行开发,我希望仅对特定页面执行检查(对于已登录的用户)。
例如:
访问“/”路径的用户如果已登录,将被重定向到“/ site”,或者会显示有关该产品的页面。访问“/ members”,“/ users”,“/ items”页面的用户如果未经过身份验证,将被重定向到登录页面。
一个简单的代码建议:
package hello
import (
"fmt"
"net/http"
"appengine"
"appengine/user"
)
func init() {
http.HandleFunc("/", site)
http.HandleFunc("/", members) // etc for "items" and "products" and whatever restricted pages
}
func user_logged_in() bool {
// do the check ...
return true
}
func user_not_logged_in() {
// fatal error message
}
func site(w http.ResponseWriter, r *http.Request) {
if !user_logged_in() {
// show "about" page
} else {
// show a "user" page
}
}
func members(w http.ResponseWriter, r *http.Request) {
if !user_logged_in() {
// show "members" page
} else {
user_not_logged_in() // fatal error message
}
}
然而这感觉有点hacky,我希望我可以测试init函数中的页面URL并预处理用户帐户一次,而不是从我的代码中的任何地方调用checker函数...
只有在用户登录后才能使http调度程序调用我的“登录所需”页面?
答案 0 :(得分:2)
init
函数仅初始化您的应用程序。例如,您可以使用它来注册HTTP处理程序,但它不会在每个请求上运行。
如果您使用其中一种标准身份验证方法,则可以在app.yaml
配置文件中声明授权。对于您的用例,它将类似于:
handlers:
- url: /members/.*
script: _go_app
login: required
- url: /users/.*
script: _go_app
login: required
- url: /items/.*
script: _go_app
login: required
- url: /.*
script: _go_app
有关详细信息,请查看docs。