当前位置: 首页 > news >正文

gin实现登录逻辑,包含cookie,session

users/login.html

{{define "users/login.html"}}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body><form method="post" action="/login">username:<input style="align-content: center" type="text" name="username" onfocus="change()"><br/>password:<input type="password" name="password" onfocus="change()"><br/><input type="submit" value="login"></form><h1 id = "tag" style="color: red">{{.Message}}</h1>
</body>
<script>function change() {let tag = document.getElementById("tag");tag.innerHTML="<h1></h1>";}
</script>
</html>
{{end}}

default/index.html

{{define "default/index.html"}}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>index页面</title>
</head>
<body>
<h1 style="color: chocolate; align-content: center">{{.Content}}</h1>
</body>
</html>
{{end}}

controllers/users.go

package controllersimport ("github.com/gin-contrib/sessions""github.com/gin-gonic/gin""net/http"
)package controllerstype Auth struct {Username stringPassword string
}const DefaultAuthInfoKey = "AUTH"func LoginGet() gin.HandlerFunc {return func(ctx *gin.Context) {ctx.HTML(http.StatusOK, "users/login.html", nil)}
}func LogoutGet() gin.HandlerFunc {return func(ctx *gin.Context) {session := sessions.Default(ctx)session.Delete(DefaultAuthInfoKey)session.Options(sessions.Options{Path:     "/",Domain:   "localhost",MaxAge:   0,Secure:   true,HttpOnly: false,SameSite: 0,})session.Save()ctx.Redirect(http.StatusFound, "/login")ctx.Abort()}
}func LoginPost() gin.HandlerFunc {return func(ctx *gin.Context) {username := ctx.PostForm("username")password := ctx.PostForm("password")if username != "admin" || password != "admin" {ctx.HTML(http.StatusOK, "users/login.html", gin.H{"Message": "用户名或密码错误!",})ctx.Abort()return}//登录成功auth := Auth{Username: username, Password: password}ctx.Set(DefaultAuthInfoKey, auth)session := sessions.Default(ctx)session.Set(DefaultAuthInfoKey, auth)session.Save() //TODO 必须Save,否则不生效ctx.Redirect(http.StatusFound, "/")}
}func Index() gin.HandlerFunc {return func(ctx *gin.Context) {ctx.HTML(http.StatusOK, "default/index.html", gin.H{"Content": "欢迎回来:" + ctx.MustGet(DefaultAuthInfoKey).(Auth).Username,})}
}

routers/router.go

package routersimport ("encoding/gob""github.com/coolbit/gin_sample/controllers""github.com/coolbit/gin_sample/middleware""github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin""net/http"
)var router *gin.Enginefunc GetRouter() *gin.Engine {return router
}func AuthRequired() gin.HandlerFunc {return func(ctx *gin.Context) {session := sessions.Default(ctx)auth := session.Get(controllers.DefaultAuthInfoKey)au, ok := auth.(controllers.Auth)if !ok || au.Username == "" {ctx.Redirect(http.StatusFound, "/login")ctx.Abort()return}ctx.Set(controllers.DefaultAuthInfoKey, auth) // 设置权限信息,供给当前请求链路使用session.Options(sessions.Options{             // 必须Save后才生效Path:     "/",Domain:   "localhost",MaxAge:   7 * 24 * 60 * 60, // 7天Secure:   true,HttpOnly: false,SameSite: 0,})session.Set(controllers.DefaultAuthInfoKey, au)session.Save() //"已刷新session"}
}func init() {router = gin.Default()// Set a lower memory limit for multipart forms (default is 32 MiB)router.MaxMultipartMemory = 8 << 20 // 8 MiBrouter.Static("/static", "static")router.LoadHTMLGlob("views/**/*")gob.Register(controllers.Auth{}) // TODO 这个必须有,没有就写不了cookiestore := cookie.NewStore([]byte("我是密钥"))router.Use(sessions.Sessions("SESSION_ID", store))router.GET("/login", controllers.LoginGet())router.POST("/login", controllers.LoginPost())router.Use(AuthRequired()) // 鉴权插件设置在这里router.GET("/", controllers.Index())
}

main.go

package mainimport ("github.com/coolbit/gin_sample/routers"
)func main() {routers.GetRouter().Run(":80")
}

登录后才能使用的系统的登录逻辑,借助cookie,session

  1. 客户端发起http://localhost/请求。
  2. 请求须经过后端AuthRequired中间件鉴权。该中间件查看session中是否保存了请求携带的cookie对应的用户信息,若有。则登录成功;若没有,则重定向到http://localhost/login进行登录。
  3. GET方法请求http://localhost/login时只返回页面,不需鉴权逻辑。
  4. POST方法请求http://localhost/login时,不需鉴权逻辑。进行登录验证,并记录session,为当前context设置Key为"AUTH"的有效用户信息。方便该次请求链路使用。登录成功则重定向到http://localhost/

相关文章:

gin实现登录逻辑,包含cookie,session

users/login.html {{define "users/login.html"}} <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录页面</title> </head> <body><form method"post" a…...

云原生Kubernetes:K8S集群版本升级(v1.22.14 - v1.23.14)

目录 一、理论 1.K8S集群升级 2.环境 3.升级集群&#xff08;v1.23.14&#xff09; 4.验证集群&#xff08;v1.23.14&#xff09; 二、实验 1. 环境 2.升级集群&#xff08;v1.23.14&#xff09; 2.验证集群&#xff08;v1.23.14&#xff09; 一、理论 1.K8S集群升级 …...

C++面向对象(OOP)编程-位运算详解

本文主要介绍原码、位运算的种类&#xff0c;以及常用的位运算的使用场景。 目录 1 原码、反码、补码 2 有符号和无符号数 3 位运算 4 位运算符使用规则 4.1 逻辑移位和算术移位 4.1.1 逻辑左移和算法左移 4.1.2 逻辑右移和算术右移 4.1.3 总结 4.2 位运算的应用场景 …...

linux运行服务提示报错/usr/bin/java: 没有那个文件或目录

如果是直接从官网下载的jdk解压安装&#xff0c;那么/usr/bin/没有java的软连接&#xff0c;即/usr/bin/java&#xff0c;所以即使在/etc/profile中配置了jdk的环境变量也没用&#xff0c;识别不到。 方法一&#xff1a;用java的执行路径配置/usr/bin/java软连接&#xff08;优…...

一篇文章教会你数据仓库之详解拉链表怎么做

前言 本文将会谈一谈在数据仓库中拉链表相关的内容&#xff0c;包括它的原理、设计、以及在我们大数据场景下的实现方式。 全文由下面几个部分组成&#xff1a; 先分享一下拉链表的用途、什么是拉链表。通过一些小的使用场景来对拉链表做近一步的阐释&#xff0c;以及拉链表和…...

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…...

项目应用多级缓存示例

前不久做的一个项目&#xff0c;需要在前端实时展示硬件设备的数据。设备很多&#xff0c;并且每个设备的数据也很多&#xff0c;总之就是数据很多。同时&#xff0c;设备的刷新频率很快&#xff0c;需要每2秒读取一遍数据。 问题来了&#xff0c;我们如何读取数据&#xff0c…...

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…...

量化服务器 - 后台挂载运行

服务器 - 后台运行 pip3命令被kill 在正常的pip命令后面加上 -no-cache-dir tmux 使用教程 https://codeleading.com/article/40954761108/ 如果你希望在 tmux 中后台执行一个 Python 脚本&#xff0c;你可以按照以下步骤操作&#xff1a; 启动 tmux: tmux这将会创建一个新…...

使用tesla gpu 加速大模型,ffmpeg,unity 和 UE等二三维应用

我们知道tesla gpu 没有显示器接口&#xff0c;那么在windows中怎么使用加速unity ue这种三维编辑器呢&#xff0c;答案就是改变注册表来加速相应的三维渲染程序. 1 tesla gpu p40 p100 加速 在windows中使用regedit 来改变 核显配置&#xff0c; 让p100 p40 等等显卡通过核显…...

巅峰画师Midjourney:新时代的独角兽

介绍 AI绘画领域中&#xff0c;Midjourney处于绝对地位&#xff0c;并且一年时间就登顶。 Midjourney是一家独立的AI研究实验室,探索新的思维媒介,拓展人类的想象力。 它由一个小型的自筹资金团队组成,专注于设计、人类基础设施和AI。 在AI绘画领域,Midjourney取得了非常突出…...

入行 4 年,跳槽 2 次,我摸透了软件测试这一行!

最近几年行业在如火如荼的发展壮大&#xff0c;以及其他传统公司都需要大批量的软件测试人员&#xff0c;但是最近几年的疫情导致大规模裁员&#xff0c;让人觉得行业寒冬已来&#xff0c;软件测试人员的职业规划值得我们深度思考。 大家都比较看好软件测试行业&#xff0c;只是…...

Hive01_安装部署

Hive的安装 上传安装包 解压 tar zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hive解决Hive与Hadoop之间guava版本差异 cd /export/software/hive/ rm -rf lib/guava-19.0.jarcp cp /export/software/hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0…...

解决国内大模型痛点的最佳实践方案

1.前言 自AI热潮掀起以来&#xff0c;国内互联网大厂躬身入局&#xff0c;各类机构奋起追赶&#xff0c;创业型企业纷至沓来。业内戏称&#xff0c;一场大模型的“百模大战”已经扩展到“千模大战”。 根据近期中国科学技术信息研究所发布的《中国人工智能大模型地图研究报告…...

当文字成为雨滴:HTML、CSS、JS创作炫酷的“文字雨“动画!

简介 在本篇技术文章中&#xff0c;将介绍如何使用HTML、CSS和JavaScript创建一个独特而引人注目的"文字(字母&数字)"雨&#x1f327;️动画效果。通过该动画&#xff0c;展现出的是一系列随机字符将从云朵中下落像是将文字变成雨滴从天而降&#xff0c;营造出与…...

计算机网络简述

前言 计算机网路是一个很庞大的话题。在此我仅对其基础概述以及简单应用进行陈述。后续或有补充以形成完善的计算机网络知识体系。 一.计算机网络的定义 根据百度词条的描述&#xff0c;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过…...

Go 泛型之类型参数

Go 泛型之类型参数 文章目录 Go 泛型之类型参数一、Go 的泛型与其他主流编程语言的泛型差异二、返回切片中值最大的元素三、类型参数&#xff08;type parameters&#xff09;四、泛型函数3.1 泛型函数的结构3.2 调用泛型函数3.3 泛型函数实例化&#xff08;instantiation&…...

KafkaLog4jAppender

Apache Log4j 中有一个 Appender 概念&#xff0c;它负责将日志信息输出到各种目的地&#xff0c;例如控制台、文件、数据库等。KafkaLog4jAppender 是 Log4j 的一个扩展&#xff0c;它可以将日志信息发送到 Apache Kafka。 下面是如何在 Log4j 中使用 KafkaLog4jAppender 的一…...

IntelliJ IDEA插件

插件安装目录&#xff1a;C:\Users\<username>\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins aiXcoder Code Completer&#xff1a;代码补全 Bookmark-X&#xff1a;书签分类 使用方法&#xff1a;鼠标移动到某一行&#xff0c;按ALT SHIFT D...

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…...

XXL-SSO开源项目未来展望:技术趋势与roadmap解读

XXL-SSO开源项目未来展望&#xff1a;技术趋势与roadmap解读 XXL-SSO作为一款分布式单点登录框架&#xff0c;已在众多企业中得到广泛应用&#xff0c;为多系统统一认证提供了轻量级且高扩展性的解决方案。随着分布式系统架构的不断演进&#xff0c;XXL-SSO正面临新的技术挑战…...

商城首页小程序源码 购物商场小程序系统 开源商城系统 基于H5小程序Uniapp开发

【核心功能】 – 前端小程序&#xff1a;uniapp 1、顶部自定义透明导航 2、搜索框 3、动态轮播图 4、动态分类导航 5、动态通知提醒 6、宫格商品列表 7、列表上滑预加载 8、底部导航 – 系统架构&#xff1a;uniapp&#xff0c;代码规范 – 适合懂uniapp的朋友使用 …...

系统级音频均衡器如何提升macOS音质:开源eqMac完全指南

系统级音频均衡器如何提升macOS音质&#xff1a;开源eqMac完全指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer &#x1f3a7; 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac eqMac是一款开源的macOS系统级音频均衡器与音量混合…...

腾讯云端Openclaw+飞书 多机器人配置全攻略(新手友好版)

前言&#xff1a;随着AI自动化工具的普及&#xff0c;Openclaw凭借强大的自主执行能力&#xff0c;成为很多人提升效率的首选&#xff1b;而飞书作为高效协同工具&#xff0c;其机器人功能可无缝融入日常工作流。当两者结合&#xff0c;配置多机器人实现分工协作&#xff08;如…...

Vue3 + xterm.js 4.x + WebSocket 打造现代化Web终端实战指南

1. 为什么选择Vue3 xterm.js 4.x WebSocket组合&#xff1f; 在构建现代化Web终端时&#xff0c;技术选型直接影响开发效率和最终用户体验。Vue3提供了响应式编程范式和组件化开发优势&#xff0c;xterm.js 4.x是最新版本的浏览器终端模拟器&#xff0c;而WebSocket则实现了…...

医学影像3D可视化的技术革新:MRIcroGL如何重构临床诊断流程

医学影像3D可视化的技术革新&#xff1a;MRIcroGL如何重构临床诊断流程 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 在医学影像分析…...

终极指南:让macOS Finder视频预览功能焕发新生的QLVideo插件

终极指南&#xff1a;让macOS Finder视频预览功能焕发新生的QLVideo插件 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://…...

突破城市交通治理瓶颈:SZT-bigdata实时客流分析系统的技术革新与实战价值

突破城市交通治理瓶颈&#xff1a;SZT-bigdata实时客流分析系统的技术革新与实战价值 【免费下载链接】SZT-bigdata 深圳地铁大数据客流分析系统&#x1f687;&#x1f684;&#x1f31f; 项目地址: https://gitcode.com/gh_mirrors/sz/SZT-bigdata 深圳地铁大数据客流分…...

从WPF迁移到Avalonia:开发者必须掌握的12个关键差异与实战转换指南

1. 文件格式与样式系统的根本差异 如果你是从WPF转向Avalonia的老手&#xff0c;第一个迎面而来的变化就是文件扩展名。在WPF中我们熟悉的.xaml文件&#xff0c;在Avalonia中变成了.axaml。这个小小的"a"前缀背后&#xff0c;其实隐藏着框架设计理念的重大转变。我刚…...

别再让广播闪退!Android 14广播安全新规RECEIVER_EXPORTED的保姆级避坑指南

Android 14广播安全新规&#xff1a;RECEIVER_EXPORTED的深度解析与实战指南 去年秋天&#xff0c;当Google正式发布Android 14时&#xff0c;许多开发者发现原本运行良好的广播注册代码突然开始抛出SecurityException。这个看似简单的API变更背后&#xff0c;其实是Android团队…...