功能介绍
虽然平时自己看各个网站,这些功能或多多少都接触到,但是每个单独拎出来搞明白还是要下功夫的,这里也算梳理一遍一个网站的用户模块一般都需要哪些功能
- 登录
- 用户名验证,就是注册时验证
- 注册
- 忘记密码
- 提交问题答案,这里会使用具有有效期的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,对应的type是username和email
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": "密码错误"
}