【实战】5-1 用户模块开发

功能介绍

虽然平时自己看各个网站,这些功能或多多少都接触到,但是每个单独拎出来搞明白还是要下功夫的,这里也算梳理一遍一个网站的用户模块一般都需要哪些功能

  • 登录
  • 用户名验证,就是注册时验证
  • 注册
  • 忘记密码
  • 提交问题答案,这里会使用具有有效期的token,使用guava缓存实现
  • 重置密码,这里分为忘记密码下的重置和登录状态下的重置
  • 获取用户信息
  • 更新用户信息,登录状态下更新
  • 退出登录

学习目标

  • 理解横向越权、纵向越权安全漏洞,以及如何避免这种安全漏洞
  • MD5的明文加密及增加salt值
  • Guava缓存的使用
  • 高复用服务响应对象的设计思想及抽象封装,这是高效代码的思想,着重理解
  • Mybatis-plugin的使用技巧
  • session的使用
  • 方法的局部演进

    怎么说呢,这些东西不接触真实项目时不会碰到的,把Java里面每个内容都学一遍老师也不一定会讲到,但是却偏偏是非常重要,这也就是实习和好老师的重要性,跟一个大腿好好学···

横向越权、纵向越权安全漏洞

  • 横向越权:攻击者尝试访问与他拥有相同权限的用户的资源
    例如一个用户可以通过自己的订单号访问自己的订单,那么如果设计部严密,他就可以通过订单号去尝试访问到别人的订单。
  • 纵向越权:低级别攻击者尝试访问高级别用户的资源
    这个好理解,比如普通用户通过分析接口可以访问管理员才能访问的资源

数据表设计

这个在前面的数据表结构设计中提到过,这里可能在根据实际代码有些讲解或者注释

接口设计

前台用户接口设计

一共11个接口

1、登录
/user/login.do post(代码需要post方式请求),开放get,方便调试

request
    username,password
response
fail
{
    "status" :1,
    "msg":"密码错误"
}

success
{
    "status":0,
    "data": {
    "id":123,
    "username":"aaa"
    "email":"aaa@163.com"
    "phone": null,
    "role": 0;
    "createTime": 1479048325000,
    "updateTime": 1479048325000
    }
}

2、注册
/user/register.do

request
    username,password,email,phone,question,answer
response
    success
    {
        "status": 0,
        "msg": "校验成功"
    }

    fail
    {
        "status": 1,
        "msg": "用户已存在"
    }

3、检查用户名是否有效
/user/check_valid.do
/check_valid.do?str=admin&type=username就是检查用户名

request
    str,type
    str可以是用户名也可以是email,对应的typeusernameemail
response
    success
    {
        "status": 0,
        "msg": "校验成功"
    }

    fail
    {
        "status": 1,
        "msg": "用户已存在"
    }

4、获取登录用户信息
/user/get_user_info.do

request
    无参数,因为我们会从session中把用户信息拿到
response
    success
    {
        "status": 0,
        "data": {
            "id":123,
            "username":"aaa"
            "email":"aaa@163.com"
            "phone": null,
            "role": 0;
            "createTime": 1479048325000,
            "updateTime": 1479048325000
        }
    }

    fail
    {
        "status": 1,
        "msg": "用户未登录,无法获取当前用户信息"
    }

5、忘记密码
/user/forget_get_question.do
localhost:8080/user/forget_get_question.do?username=winxblast

request
    username
response
    success
    {
        "status": 0,
        "data": "这里面返回问题"
    }

    fail
    {
        "status": 1,
        "msg": "该用户未设置密码找回问题"
    }

6、提交问题答案
/user/forget_check_answer.do
localhost:8080/user/forget_check_answer.do?username=aaa&qusetion=aa&answer=sss

request
    username,question,answer
response
    正确的返回值里面有一个token,修改密码的时候需要用这个,传递给下一个接口,token是有有效期的
    有效期通过guava的cache实现,后续可以改成Redis
    success
    {
        "status": 0,
        "data": "531ef4b4-9663-4e6d-9a20-fb56367446a5"
    }

    fail
    {
        "status": 1,
        "msg": "问题答案错误"
    }

7、忘记密码的重设密码
/user/forgot_reset_password.do

localhost:8080/user/forgot_reset_pawwword.do?
username=aaa?passwordNew=xxx&forgetToken=531ef4b4-9663-4e6d-9a20-fb56367446a5
如果这里不传token的话就是一个经典的横向越权情况,不需要token就能直接修改别人的密码,而有了token,只有正确回答了问题答案的人才能修改,并且是有有效期的

request
    username,passwordNew,forgetToken
response
    success
    {
        "status": 0,
        "msg": "修改密码成功"
    }

    fail
    {
        "status": 1,
        "msg": "修改密码操作失效"
    }
    或
    {
        "status": 1,
        "msg": "token已经失效"
    }

8、登录中状态重置密码
/user/reset_password.do
用户不需要传,可以从session获取

request
    passwordOld,passwordNew
response
    success
    {
        "status": 0,
        "msg": "修改密码成功"
    }

    fail
    {
        "status": 1,
        "msg": "旧密码输入错误"
    }

9、登录状态更新个人信息
/user/update_information.do

request
    email,phone,question,answer
response
    success
    {
        "status": 0,
        "msg": "更新个人信息成功"
    }

    fail
    {
        "status": 1,
        "msg": "用户未登录"
    }

10、获取当前登录用户的详细信息,并强制登录
/user/get_information.do

request
    无参数
response
    success
    {
        "status": 0,
        "data": {
            "id":1234,
            "username":"admin"
            "password": "",
            "email":"admin@163.com"
            "phone": 13800001234,
            "role": 1;
            "createTime": 1479048325000,
            "updateTime": 1479048325000
        }
    }

    fail
    {
        "status": 10,
        "msg": "用户未登录,无法获取当前用户信息,status=10,强制登录"
    }

11、退出登录
/user/logout.do

request
    无,直接从session中获取,并remove掉
response
    success
    {
        "status": 0,
        "msg": "退出成功"
    }

    fail
    {
        "status": 1,
        "msg": "服务器异常"
    }

后台用户接口设计

1、后台管理员登录
/manage/user/login.do
这里一定要小心,不要使用“/manager”,这个地址可能会跟tomcat自己的manager冲突导致无法访问,反正我是搞了好长时间,才发现老师用的是manage而我是manager,然后就各种404无法访问到

request
    String username,
    String password
response
    success
    {
        "status": 0,
        "data": {
            "id":12,
            "username":"admin"
            "password": "",
            "email":"admin@163.com"
            "phone": null,
            "role": 0;
            "createTime": 1479048325000,
            "updateTime": 1479048325000
        }
    }

    fail
    {
        "status": 1,
        "msg": "密码错误"
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值