diff --git a/main.go b/main.go index a63089d..e9fa68c 100644 --- a/main.go +++ b/main.go @@ -10,50 +10,77 @@ import ( ) const ( + // SessionKey Session主Key + SessionKey = "token" // SessionUser 用户登录的Session标签 - SessionUser = "token" + SessionUser = "user" ) func auth(ctx *gin.Context) { + if ctx.Request.RequestURI != "/api/login" { + session := sessions.Default(ctx) + if token := session.Get(SessionUser); token == nil { - ctx.Redirect(http.StatusNotModified, "/api/login") + session.Clear() + session.Save() + + ctx.JSON(http.StatusUnauthorized, gin.H{"message": "需要登录"}) return } } + ctx.Next() } func login(ctx *gin.Context) { - ctx.Request.ParseForm() user := ctx.PostForm("user") + session := sessions.Default(ctx) + + if user == "" { + + if tokenUser := session.Get(SessionUser); tokenUser != nil { + ctx.JSON(http.StatusOK, gin.H{"user": tokenUser}) + return + } + + } if realPassword, ok := GlobalConfig.GetUser(user); ok { pwd := ctx.PostForm("pwd") if realPassword == pwd { - session := sessions.Default(ctx) session.Set(SessionUser, user) session.Save() - } else { - ctx.JSON(http.StatusUnauthorized, gin.H{"error": "密码错误"}) + ctx.JSON(http.StatusOK, gin.H{"message": "登录成功"}) + return } - } else { - ctx.JSON(http.StatusUnauthorized, gin.H{"error": "不存在该用户"}) + + ctx.JSON(http.StatusUnauthorized, gin.H{"error": "密码错误"}) return } - ctx.JSON(http.StatusOK, gin.H{"message": "登录成功"}) - // ctx.Redirect(http.StatusOK, "/worker") + ctx.JSON(http.StatusUnauthorized, gin.H{"error": "不存在该用户"}) + return + // ctx.Redirect(http.StatusOK, "/worker") + // ctx.Next() +} + +func logout(ctx *gin.Context) { + session := sessions.Default(ctx) + session.Clear() + session.Save() } func userConfig(ctx *gin.Context) { - ctx.Request.ParseForm() + session := sessions.Default(ctx) - if session.Get(SessionUser) == nil { + user := session.Get(SessionUser) + // log.Println(user) + if user == nil { ctx.JSON(http.StatusUnauthorized, gin.H{"error": "权限错误"}) return } @@ -64,10 +91,12 @@ func main() { eg := gin.New() - eg.Use(sessions.Sessions(SessionUser, cookie.NewStore([]byte("yame")))) + eg.Use(sessions.Sessions(SessionKey, cookie.NewStore([]byte("yame")))) eg.Use(auth) eg.POST("/api/login", login) eg.POST("/api/user/config", userConfig) + eg.POST("/api/user/logout", logout) + log.Fatal(eg.Run(":3001")) } diff --git a/main_test.go b/main_test.go index d5d7fa5..80820ef 100644 --- a/main_test.go +++ b/main_test.go @@ -1,20 +1,9 @@ package main import ( - "log" "testing" - - "github.com/gin-contrib/sessions" - "github.com/gin-contrib/sessions/cookie" - "github.com/gin-gonic/gin" ) func TestMain(t *testing.T) { - eg := gin.New() - - eg.Use(sessions.Sessions(SessionUser, cookie.NewStore([]byte("yame")))) - eg.Use(auth) - - eg.POST("/api/login", login) - log.Fatal(eg.Run(":3001")) + main() } diff --git a/web/src/App.js b/web/src/App.js index b7a9461..e2848ff 100755 --- a/web/src/App.js +++ b/web/src/App.js @@ -1,4 +1,5 @@ import React from 'react'; +import ReactDOM from 'react-dom'; import axios from 'axios'; import { Form, Select, InputNumber, DatePicker, Switch, Slider, Button } from 'antd'; import './App.css'; @@ -9,9 +10,21 @@ import Login from './login'; const { Option } = Select; +// 响应拦截 +axios.interceptors.response.use((response) => { + return response +}, (err) => { + if(err.response.status === 401){ + ReactDOM.render(, document.getElementById('root')); + } + return Promise.reject(err) +}) + + const App = () => ( - + + // ); diff --git a/web/src/login.js b/web/src/login.js index 9080aa0..8b64ab1 100644 --- a/web/src/login.js +++ b/web/src/login.js @@ -10,6 +10,21 @@ import SiderConfig from './siderConfig'; class Login extends React.Component { + componentWillMount() { + + if(this.props.isAutoLogin) { + + axios.post("/api/login", new FormData()).then(loginInfo => { + axios.post("/api/user/config", new FormData()).then( value => { + console.log(value); + ReactDom.render(, document.getElementById('root')) + } ) + + return + }); + } + } + onClick = (e) => { var user = this.refs["login-user"].input.value var pwd = this.refs["login-passwd"].input.value @@ -22,20 +37,19 @@ class Login extends React.Component { console.log("Cookies are ", document.cookie) ReactDom.render(, document.getElementById('root')) return - }); } render() { return ( - +
Apollo Local - } suffix={ diff --git a/web/src/namespaceSelect.js b/web/src/namespaceSelect.js index 0117154..bccfc02 100644 --- a/web/src/namespaceSelect.js +++ b/web/src/namespaceSelect.js @@ -21,8 +21,8 @@ class NamespaceSelect extends React.Component { onDropdownVisibleChange = (open) => { if(open) { var resp = axios.post("/api/user/config") - console.log(resp) + console.log(resp) } } diff --git a/web/src/siderConfig.js b/web/src/siderConfig.js index 5d5c76b..eb7a2e3 100644 --- a/web/src/siderConfig.js +++ b/web/src/siderConfig.js @@ -1,8 +1,12 @@ import React from 'react'; +import ReactDom from 'react-dom'; +import axios from 'axios'; import { Layout, Menu, Breadcrumb, Icon, Button, Row, Col, Tag } from 'antd'; import { Input } from 'antd'; import NamespaceSelect from './namespaceSelect'; import Text from 'antd/lib/typography/Text'; +import Login from './login'; +import App from './App'; const { TextArea } = Input; const { Header, Content, Footer, Sider } = Layout; @@ -18,6 +22,15 @@ class SiderConfig extends React.Component { this.setState({ collapsed }); }; + onClickLogout = e => { + + axios.post("/api/user/logout", new FormData()).then(loginInfo => { + ReactDom.render(, document.getElementById('root')); + return; + }); + + }; + render() { return ( @@ -32,11 +45,9 @@ class SiderConfig extends React.Component { Namespace - + }> - - - + @@ -49,7 +60,7 @@ class SiderConfig extends React.Component { 用户: {this.props.userName} - +