美文网首页
【Go Web开发】用户管理

【Go Web开发】用户管理

作者: Go语言由浅入深 | 来源:发表于2022-03-07 23:34 被阅读0次

    用户模型建立和注册

    在接下来的内容中,我们将把重点转向用户:用户注册,激活,验证,以及根据用户拥有的权限限制对API接口的访问。

    但在我们实现这些功能之前,需要为此打点基础。具体来说,我们需要:

    • 在PostgreSQL中创建users表来存储用户信息
    • 创建UserModel来对数据库中users进行操作,验证用户数据以及对用户密码进行hash处理。
    • 开发POST /v1/users接口来实现用户注册。

    创建Users数据库表

    首先在数据库中创建一张新的users表。如果你跟随本系列文章操作,使用迁移工具生成一对新的SQL迁移文件:

    $ migrate create -seq -ext=.sql -dir=./migrations create_users_table
    /home/alex/Projects/greenlight/migrations/000004_create_users_table.up.sql 
    /home/alex/Projects/greenlight/migrations/000004_create_users_table.down.sql
    

    然后将下面的SQL语句分别添加到up和down文件中:

    File: migreates/000004_create_users_table.up.sql


    CREATE TABLE IF NOT EXISTS users (
        id bigserial PRIMARY KEY,
        create_at timestamp(0) with time zone NOT NULL DEFAULT NOW(),
        name text NOT NULL,
        email citext UNIQUE NOT NULL,
        password_hash bytea NOT NULL,
        activated bool NOT NULL,
        version integer NOT NULL DEFAULT 1
    );
    

    File: migrations/000004_create_users_table.down.sql

    DROP TABLE IF EXISTS users;
    

    关于CREATE TABLE语句有一些有趣的地方,我想快速解释一下:

    1、email类型为citext(不区分大小写)。这类文本信息按原样存储,和区分大小写类型的数据相比,对其不做任何修改,包括对相关索引的查找。

    2、在email列还加了UNIQUE约束。结合citext类型,这意味着表中不存在多行具备一样的email值,即使其他大小写不同。这实质上做了一个数据库级业务规则,即不应该有两个用户具有相同的电子邮件地址。

    3、password_hash类型为bytea(二进制字符串)。在这列,我们将存储使用bcrypt生成的用户密码的散列值——而不是明文密码。

    4、activated存储布尔类型值表示用户账号是否激活。创建用户时默认是false,要求用户确认email地址才能设置为true。

    5、这里我们也包含version列,每次数据的更新都自增1。这将允许我们在更新用户记录时使用乐观锁定来防止竞争条件,就像我们在前面对movie表所做的那样。

    好了,下面执行数据库“up”迁移:

    $  migrate -path=./migrations -database=$GREENLIGHT_DB_DSN up
    4/u create_users_table (139.162166ms)
    

    然后,连接到你的数据库,并验证新的用户表已经创建,如预期:

    psql $GREENLIGHT_DB_DSN
    psql (13.4)
    Type "help" for help.
    
    greenlight=> \d users
                                              Table "public.users"
        Column     |            Type             | Collation | Nullable |              Default  
    ---------------+-----------------------------+-----------+----------+------------------------
     id            | bigint                      |           | not null | nextval('users_id_seq'::regclass)
     create_at     | timestamp(0) with time zone |           | not null | now()
     name          | text                        |           | not null | 
     email         | citext                      |           | not null | 
     password_hash | bytea                       |           | not null | 
     activated     | boolean                     |           | not null | 
     version       | integer                     |           | not null | 1
    Indexes:
        "users_pkey" PRIMARY KEY, btree (id)
        "users_email_key" UNIQUE CONSTRAINT, btree (email)
    

    这里需要指出的一件重要的事情是:电子邮件列上的UNIQUE约束已经自动分配了名称users_email_key。这和下一节要介绍的内容相关,当处理用户使用相同的邮件地址注册两次所引起的任何错误时有用。

    相关文章

      网友评论

          本文标题:【Go Web开发】用户管理

          本文链接:https://www.haomeiwen.com/subject/hqporrtx.html