mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-02 11:20:18 +08:00
feat: session without autosignin will expire
Signed-off-by: Kininaru <shiftregister233@outlook.com>
This commit is contained in:
@ -52,6 +52,8 @@ type RequestForm struct {
|
|||||||
EmailCode string `json:"emailCode"`
|
EmailCode string `json:"emailCode"`
|
||||||
PhoneCode string `json:"phoneCode"`
|
PhoneCode string `json:"phoneCode"`
|
||||||
PhonePrefix string `json:"phonePrefix"`
|
PhonePrefix string `json:"phonePrefix"`
|
||||||
|
|
||||||
|
AutoSignin bool `json:"autoSignin"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Response struct {
|
type Response struct {
|
||||||
@ -185,6 +187,7 @@ func (c *ApiController) Logout() {
|
|||||||
util.LogInfo(c.Ctx, "API: [%s] logged out", user)
|
util.LogInfo(c.Ctx, "API: [%s] logged out", user)
|
||||||
|
|
||||||
c.SetSessionUsername("")
|
c.SetSessionUsername("")
|
||||||
|
c.SetSessionData(nil)
|
||||||
|
|
||||||
resp = Response{Status: "ok", Msg: "", Data: user}
|
resp = Response{Status: "ok", Msg: "", Data: user}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/casdoor/casdoor/idp"
|
"github.com/casdoor/casdoor/idp"
|
||||||
@ -58,6 +59,16 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
|
|||||||
} else {
|
} else {
|
||||||
resp = &Response{Status: "error", Msg: fmt.Sprintf("Unknown response type: %s", form.Type)}
|
resp = &Response{Status: "error", Msg: fmt.Sprintf("Unknown response type: %s", form.Type)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if user did not check auto signin
|
||||||
|
if resp.Status == "ok" && !form.AutoSignin {
|
||||||
|
timestamp := time.Now().Unix()
|
||||||
|
timestamp += 3600 * 24
|
||||||
|
c.SetSessionData(&SessionData{
|
||||||
|
ExpireTime: timestamp,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,13 +14,32 @@
|
|||||||
|
|
||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import "github.com/astaxie/beego"
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
"github.com/casdoor/casdoor/util"
|
||||||
|
)
|
||||||
|
|
||||||
type ApiController struct {
|
type ApiController struct {
|
||||||
beego.Controller
|
beego.Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SessionData struct {
|
||||||
|
ExpireTime int64
|
||||||
|
}
|
||||||
|
|
||||||
func (c *ApiController) GetSessionUsername() string {
|
func (c *ApiController) GetSessionUsername() string {
|
||||||
|
// check if user session expired
|
||||||
|
sessionData := c.GetSessionData()
|
||||||
|
if sessionData != nil &&
|
||||||
|
sessionData.ExpireTime != 0 &&
|
||||||
|
sessionData.ExpireTime < time.Now().Unix() {
|
||||||
|
c.SetSessionUsername("")
|
||||||
|
c.SetSessionData(nil)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
user := c.GetSession("username")
|
user := c.GetSession("username")
|
||||||
if user == nil {
|
if user == nil {
|
||||||
return ""
|
return ""
|
||||||
@ -33,6 +52,30 @@ func (c *ApiController) SetSessionUsername(user string) {
|
|||||||
c.SetSession("username", user)
|
c.SetSession("username", user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ApiController) GetSessionData() *SessionData {
|
||||||
|
session := c.GetSession("SessionData")
|
||||||
|
if session == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionData := &SessionData{}
|
||||||
|
err := util.JsonToStruct(session.(string), sessionData)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sessionData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ApiController) SetSessionData(s *SessionData) {
|
||||||
|
if s == nil {
|
||||||
|
c.DelSession("SessionData")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.SetSession("SessionData", util.StructToJson(s))
|
||||||
|
}
|
||||||
|
|
||||||
func wrapActionResponse(affected bool) *Response {
|
func wrapActionResponse(affected bool) *Response {
|
||||||
if affected {
|
if affected {
|
||||||
return &Response{Status: "ok", Msg: "", Data: "Affected"}
|
return &Response{Status: "ok", Msg: "", Data: "Affected"}
|
||||||
|
@ -25,3 +25,7 @@ func StructToJson(v interface{}) string {
|
|||||||
|
|
||||||
return string(data)
|
return string(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func JsonToStruct(data string, v interface{}) error {
|
||||||
|
return json.Unmarshal([]byte(data), v)
|
||||||
|
}
|
||||||
|
@ -278,7 +278,7 @@ class LoginPage extends React.Component {
|
|||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item>
|
<Form.Item>
|
||||||
<Form.Item name="remember" valuePropName="checked" noStyle>
|
<Form.Item name="autoSignin" valuePropName="checked" noStyle>
|
||||||
<Checkbox style={{float: "left"}} disabled={!application.enablePassword}>
|
<Checkbox style={{float: "left"}} disabled={!application.enablePassword}>
|
||||||
{i18next.t("login:Auto login")}
|
{i18next.t("login:Auto login")}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
|
Reference in New Issue
Block a user