账号系统与鉴权

账号系统与鉴权

开发用户系统模块

账号系统功能

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值