账号系统与鉴权
Posted 旧时星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了账号系统与鉴权相关的知识,希望对你有一定的参考价值。
账号系统与鉴权
开发用户系统模块
账号系统功能
1.支持用户注册/登录
2.支持用户Session鉴权
3.用户数据资源隔离
首先数据库建表
create table `tbl_user`(
`id` int(11) not null default" comment '用户名',
`user_name` varchar(64) not null default " comment'用户名',
`user_pwd` varchar(256) not null default " comment '用户encoded密码',
`email` varchar(64) default " comment'手机号',
`phone` varchar(128) default " comment'邮箱',
`email_validated` tinyint(1) default 0 comment '邮箱是否已验证',
`phone_validated` tinyint(1)default 0 comment '手机号是否已验证',
`signup_at` datetime default current_timestamp comment '注册日期',
`last_active` datetime default current_timestamp on update current_times,
`profile` text comment '用户属性',
`status`int(11) not null default '0' comment '账户状态(启用/禁用/锁定/标记删除等)',
primary key(`id`),
unique key `isx_phone`(`phone`),
key `idx_status`(`status`)
)engine=InnoDB AUTO_INCREMENT=5 default charset=utf8mb4;
用户注册功能
先是实现根据输入的用户的用户名以及密码插入到数据库中的用户表中
//通过用户名以及密码完成user表的注册操作
func UserSignup(username string,passwd string)bool
stmt,err:=mydb.DBConn().Prepare(
"insert ignore into tbl_user(`user_name`,`user_pwd`)values(?,?)")
if err!=nil
fmt.Println("Failed to insert,err:"+err.Error())
return false
defer stmt.Close()
ret,err:=stmt.Exec(username,passwd)
if err!=nil
fmt.Println("Failed to insert,err:"+err.Error())
return false
if rowsAffected,err:=ret.RowsAffected();nil==err && rowsAffected>0
return true
return false
网页方面
即显示出注册页面后,由输入获取用户名以及密码,转到上面存入数据库中,在此之前对密码进行算法加密在存入数据库中
package handler
import (
"io/ioutil"
"net/http"
dblayer"rgo/src/db"
"rgo/src/util"
)
const(
pwd_salt="#*890"
)
//处理用户注册请求
func SignupHandler(w http.ResponseWriter,r*http.Request)
if r.Method==http.MethodGet
data,err:=ioutil.ReadFile("./static/view/signup.html")
if err!=nil
w.WriteHeader(http.StatusInternalServerError)
return
w.Write(data)
return
r.ParseForm()
username:=r.Form.Get("username")
passwd:=r.Form.Get("password")
if len(username)<3 || len(passwd)<5
w.Write([]byte("Invalid parameter"))
return
enc_passwd:=util.Shal([]byte(passwd+pwd_salt))
suc:=dblayer.UserSignup(username,enc_passwd)
if suc
w.Write([]byte("success"))
else
w.Write([]byte("failed"))
注册之后即是验证登录
有网页输入的用户名以及密码今昔那个校验,同时输入生成的验证码
验证码的生成通过算法,且每次登录都会跟新数据库中的对应的token即验证码
//登录接口
func SignInHandler(w http.ResponseWriter,r* http.Request)
r.ParseForm()
username:=r.Form.Get("username")
password:=r.Form.Get("password")
encPasswd:=util.Shal([]byte(password+pwd_salt))
//1.校验用户名以及密码
pwdChecked:=dblayer.UserSignin(username,encPasswd)
if !pwdChecked
w.Write([]byte("failed"))
return
//2.生成访问凭证
token:=GenToken(username)
upRes:=dblayer.UpdateToken(username,token)
if !upRes
w.Write([]byte("failed"))
return
//3.登陆成功后重新定向到首页
w.Write([]byte("http://"+r.Host+"/static/view/home.html"))
func GenToken(username string)string
//40为字符:md5(username+timestamp+token_salt)+timestamp[:8]
ts:=fmt.Sprintf("%x",time.Now().Unix())
tokenPrefix:=util.MD5([]byte(username+ts+"_tokensalt"))
return tokenPrefix+ts[:8]
//刷新用户登录的token
func UpdateToken(username string,token string)bool
stmt,err:=mydb.DBConn().Prepare(
"replace into tbl_user_token(`user_name`,`user_token`)values(?,?)")
if err!=nil
fmt.Println(err.Error())
return false
defer stmt.Close()
ret,err:=stmt.Exec(username,token)
if err!=nil
fmt.Println(err.Error())
return false
return true
以上是关于账号系统与鉴权的主要内容,如果未能解决你的问题,请参考以下文章