账号系统与鉴权

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

以上是关于账号系统与鉴权的主要内容,如果未能解决你的问题,请参考以下文章

无线端安全登录与鉴权一之Kerberos

公共平台服务治理与鉴权

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

访问控制与鉴权设计

微服务架构中的安全认证与鉴权

微服务架构下的鉴权,怎么做更优雅?