update session
This commit is contained in:
parent
0d1872ebe3
commit
f9c07c4186
7 changed files with 79 additions and 21 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,6 +5,7 @@ gogs
|
||||||
*.db
|
*.db
|
||||||
*.log
|
*.log
|
||||||
custom/
|
custom/
|
||||||
|
data/
|
||||||
.vendor/
|
.vendor/
|
||||||
.idea/
|
.idea/
|
||||||
*.iml
|
*.iml
|
27
conf/app.ini
27
conf/app.ini
|
@ -72,6 +72,33 @@ INTERVAL = 60
|
||||||
; memcache: "127.0.0.1:11211"
|
; memcache: "127.0.0.1:11211"
|
||||||
HOST =
|
HOST =
|
||||||
|
|
||||||
|
[session]
|
||||||
|
; Either "memory", "file", "redis" or "mysql", default is "memory"
|
||||||
|
PROVIDER = file
|
||||||
|
; provider config
|
||||||
|
; memory: not have any config yet
|
||||||
|
; file: session file path
|
||||||
|
; e.g. tmp/sessions
|
||||||
|
; redis: config like redis server addr,poolSize,password
|
||||||
|
; e.g. 127.0.0.1:6379,100,astaxie
|
||||||
|
; mysql: go-sql-driver/mysql dsn config string
|
||||||
|
; e.g. root:password@/session_table
|
||||||
|
PROVIDER_CONFIG = data/sessions
|
||||||
|
; session cookie name
|
||||||
|
COOKIE_NAME = i_like_gogits
|
||||||
|
; if you use session in https only, default is false
|
||||||
|
COOKIE_SECURE = false
|
||||||
|
; enable set cookie, default is true
|
||||||
|
ENABLE_SET_COOKIE = true
|
||||||
|
; session gc time interval, default is 86400
|
||||||
|
GC_INTERVAL_TIME = 86400
|
||||||
|
; session life time, default is 86400
|
||||||
|
SESSION_LIFE_TIME = 86400
|
||||||
|
; session id hash func, default is sha1
|
||||||
|
SESSION_ID_HASHFUNC = sha1
|
||||||
|
; session hash key, default is use random string
|
||||||
|
SESSION_ID_HASHKEY =
|
||||||
|
|
||||||
[picture]
|
[picture]
|
||||||
; The place to picture data, either "server" or "qiniu", default is "server"
|
; The place to picture data, either "server" or "qiniu", default is "server"
|
||||||
SERVICE = server
|
SERVICE = server
|
||||||
|
|
|
@ -9,7 +9,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/codegangsta/martini"
|
"github.com/codegangsta/martini"
|
||||||
"github.com/martini-contrib/sessions"
|
|
||||||
|
"github.com/gogits/session"
|
||||||
|
|
||||||
"github.com/gogits/binding"
|
"github.com/gogits/binding"
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// SignedInId returns the id of signed in user.
|
// SignedInId returns the id of signed in user.
|
||||||
func SignedInId(session sessions.Session) int64 {
|
func SignedInId(session session.SessionStore) int64 {
|
||||||
userId := session.Get("userId")
|
userId := session.Get("userId")
|
||||||
if userId == nil {
|
if userId == nil {
|
||||||
return 0
|
return 0
|
||||||
|
@ -34,7 +35,7 @@ func SignedInId(session sessions.Session) int64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignedInName returns the name of signed in user.
|
// SignedInName returns the name of signed in user.
|
||||||
func SignedInName(session sessions.Session) string {
|
func SignedInName(session session.SessionStore) string {
|
||||||
userName := session.Get("userName")
|
userName := session.Get("userName")
|
||||||
if userName == nil {
|
if userName == nil {
|
||||||
return ""
|
return ""
|
||||||
|
@ -46,7 +47,7 @@ func SignedInName(session sessions.Session) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignedInUser returns the user object of signed user.
|
// SignedInUser returns the user object of signed user.
|
||||||
func SignedInUser(session sessions.Session) *models.User {
|
func SignedInUser(session session.SessionStore) *models.User {
|
||||||
id := SignedInId(session)
|
id := SignedInId(session)
|
||||||
if id <= 0 {
|
if id <= 0 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -61,7 +62,7 @@ func SignedInUser(session sessions.Session) *models.User {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsSignedIn check if any user has signed in.
|
// IsSignedIn check if any user has signed in.
|
||||||
func IsSignedIn(session sessions.Session) bool {
|
func IsSignedIn(session session.SessionStore) bool {
|
||||||
return SignedInId(session) > 0
|
return SignedInId(session) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/Unknwon/goconfig"
|
"github.com/Unknwon/goconfig"
|
||||||
|
|
||||||
"github.com/gogits/cache"
|
"github.com/gogits/cache"
|
||||||
|
"github.com/gogits/session"
|
||||||
|
|
||||||
"github.com/gogits/gogs/modules/log"
|
"github.com/gogits/gogs/modules/log"
|
||||||
)
|
)
|
||||||
|
@ -49,6 +50,10 @@ var (
|
||||||
|
|
||||||
LogMode string
|
LogMode string
|
||||||
LogConfig string
|
LogConfig string
|
||||||
|
|
||||||
|
SessionProvider string
|
||||||
|
SessionConfig *session.Config
|
||||||
|
SessionManager *session.Manager
|
||||||
)
|
)
|
||||||
|
|
||||||
var Service struct {
|
var Service struct {
|
||||||
|
@ -164,6 +169,30 @@ func newCacheService() {
|
||||||
log.Info("Cache Service Enabled")
|
log.Info("Cache Service Enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newSessionService() {
|
||||||
|
SessionProvider = Cfg.MustValue("session", "PROVIDER", "memory")
|
||||||
|
|
||||||
|
SessionConfig = new(session.Config)
|
||||||
|
SessionConfig.ProviderConfig = Cfg.MustValue("session", "PROVIDER_CONFIG")
|
||||||
|
SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits")
|
||||||
|
SessionConfig.CookieSecure = Cfg.MustBool("session", "COOKIE_SECURE")
|
||||||
|
SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true)
|
||||||
|
SessionConfig.GcIntervalTime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400)
|
||||||
|
SessionConfig.SessionLifeTime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400)
|
||||||
|
SessionConfig.SessionIDHashFunc = Cfg.MustValue("session", "SESSION_ID_HASHFUNC", "sha1")
|
||||||
|
SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY")
|
||||||
|
|
||||||
|
var err error
|
||||||
|
SessionManager, err = session.NewManager(SessionProvider, *SessionConfig)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Init session system failed, provider: %s, %v\n",
|
||||||
|
SessionProvider, err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("Session Service Enabled")
|
||||||
|
}
|
||||||
|
|
||||||
func newMailService() {
|
func newMailService() {
|
||||||
// Check mailer setting.
|
// Check mailer setting.
|
||||||
if Cfg.MustBool("mailer", "ENABLED") {
|
if Cfg.MustBool("mailer", "ENABLED") {
|
||||||
|
@ -234,6 +263,7 @@ func NewServices() {
|
||||||
newService()
|
newService()
|
||||||
newLogService()
|
newLogService()
|
||||||
newCacheService()
|
newCacheService()
|
||||||
|
newSessionService()
|
||||||
newMailService()
|
newMailService()
|
||||||
newRegisterMailService()
|
newRegisterMailService()
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/codegangsta/martini"
|
"github.com/codegangsta/martini"
|
||||||
"github.com/martini-contrib/sessions"
|
|
||||||
|
|
||||||
"github.com/gogits/cache"
|
"github.com/gogits/cache"
|
||||||
|
"github.com/gogits/session"
|
||||||
|
|
||||||
"github.com/gogits/gogs/models"
|
"github.com/gogits/gogs/models"
|
||||||
"github.com/gogits/gogs/modules/auth"
|
"github.com/gogits/gogs/modules/auth"
|
||||||
|
@ -27,7 +27,7 @@ type Context struct {
|
||||||
p martini.Params
|
p martini.Params
|
||||||
Req *http.Request
|
Req *http.Request
|
||||||
Res http.ResponseWriter
|
Res http.ResponseWriter
|
||||||
Session sessions.Session
|
Session session.SessionStore
|
||||||
Cache cache.Cache
|
Cache cache.Cache
|
||||||
User *models.User
|
User *models.User
|
||||||
IsSigned bool
|
IsSigned bool
|
||||||
|
@ -92,21 +92,25 @@ func (ctx *Context) Handle(status int, title string, err error) {
|
||||||
|
|
||||||
// InitContext initializes a classic context for a request.
|
// InitContext initializes a classic context for a request.
|
||||||
func InitContext() martini.Handler {
|
func InitContext() martini.Handler {
|
||||||
return func(res http.ResponseWriter, r *http.Request, c martini.Context,
|
return func(res http.ResponseWriter, r *http.Request, c martini.Context, rd *Render) {
|
||||||
session sessions.Session, rd *Render) {
|
|
||||||
|
|
||||||
ctx := &Context{
|
ctx := &Context{
|
||||||
c: c,
|
c: c,
|
||||||
// p: p,
|
// p: p,
|
||||||
Req: r,
|
Req: r,
|
||||||
Res: res,
|
Res: res,
|
||||||
Session: session,
|
|
||||||
Cache: base.Cache,
|
Cache: base.Cache,
|
||||||
Render: rd,
|
Render: rd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// start session
|
||||||
|
ctx.Session = base.SessionManager.SessionStart(res, r)
|
||||||
|
defer func() {
|
||||||
|
ctx.Session.SessionRelease(res)
|
||||||
|
}()
|
||||||
|
|
||||||
// Get user from session if logined.
|
// Get user from session if logined.
|
||||||
user := auth.SignedInUser(session)
|
user := auth.SignedInUser(ctx.Session)
|
||||||
ctx.User = user
|
ctx.User = user
|
||||||
ctx.IsSigned = user != nil
|
ctx.IsSigned = user != nil
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ func SignIn(ctx *middleware.Context, form auth.LogInForm) {
|
||||||
|
|
||||||
user, err := models.LoginUserPlain(form.UserName, form.Password)
|
user, err := models.LoginUserPlain(form.UserName, form.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.Error() == models.ErrUserNotExist.Error() {
|
if err == models.ErrUserNotExist {
|
||||||
ctx.RenderWithErr("Username or password is not correct", "user/signin", &form)
|
ctx.RenderWithErr("Username or password is not correct", "user/signin", &form)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
5
web.go
5
web.go
|
@ -12,7 +12,6 @@ import (
|
||||||
|
|
||||||
"github.com/codegangsta/cli"
|
"github.com/codegangsta/cli"
|
||||||
"github.com/codegangsta/martini"
|
"github.com/codegangsta/martini"
|
||||||
"github.com/martini-contrib/sessions"
|
|
||||||
|
|
||||||
"github.com/gogits/binding"
|
"github.com/gogits/binding"
|
||||||
|
|
||||||
|
@ -81,10 +80,6 @@ func runWeb(*cli.Context) {
|
||||||
// Middlewares.
|
// Middlewares.
|
||||||
m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}}))
|
m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}}))
|
||||||
|
|
||||||
// TODO: should use other store because cookie store is not secure.
|
|
||||||
store := sessions.NewCookieStore([]byte("secret123"))
|
|
||||||
m.Use(sessions.Sessions("my_session", store))
|
|
||||||
|
|
||||||
m.Use(middleware.InitContext())
|
m.Use(middleware.InitContext())
|
||||||
|
|
||||||
reqSignIn := middleware.SignInRequire(true)
|
reqSignIn := middleware.SignInRequire(true)
|
||||||
|
|
Reference in a new issue