前言
目前该模块仍然沿袭旧版本的设计,由于个人经验和能力的不足,所以存在很多隐患和漏洞,请谅解。
权限模块总共五张表,用户-角色-权限,并且为了方便,系统是基于角色控制用户操作权限的。
而真实的情况应该是很多张权限表,并且用户个人信息与用户权限信息应该是独立的,比如tuser不涉及用户的个人信息的,而core_user_base(表名随意)记录用户信息,而其中的用户有哪些信息应该在记录在一张表cfg_user_base_info中,目前登录是系统内单独注册的,应该有第三方登录,如qq,微信等,目前为涉及,请谅解,后续有能力在搞。
另外权限是由shiro控制,并且每次都需要从数据库进行验证,合理的应该是初始化到redis。
数据库设计
t_user(用户表)
其中user_state是用户拉黑状态,eCode是用户最后注册成功的邮箱激活码
t_role(角色表)
t_user_role(用户-角色关系表)
t_permisssion(权限表)
t_role_permisssion(角色-权限关系表)
t_email_code(邮箱记录表)
该表主要用于验证邮箱是否已被注册和记录最后一次邮箱的激活码
用户注册简单说明
该实现方法仅作为本项目娱乐使用,用户点击注册,第一个页面包含用户名和邮箱,首先对用户名进行重名校验,邮箱是否已被注册,第二个页面点击发送验证码,如果成功发送出去(一般在垃圾箱),然后在邮箱记录表中进行记录,然后前端判断激活码是否正确。
旧版本这里将邮箱发送做成微服务,利用activeMq进行一对一发送,同时,这里邮箱激活码可以改成链接带上激活码参数更优
最后一步填写相关信息,注册成功后跳转至个人信息控制页
登录模块
旧版本做的很不合理,应该利用redis做成单点登录。目前就是单击通过用户名,密码登录。
利用shiro控制权限认证,在进行权限认证的时候,需要进行黑名单过滤和登录日志统计
1.黑名单 即利用用户状态判定该用户状态是否被锁定,这里有一个bug未解决,就是用户输入不存在的用户名称时,这里 String nickName = request.getParameter(“nickName”);为空,直接返回fasle,前端通过ajax无法判断,所以无任何改变
2.登录日志统计
主要利用一个过滤器继续aop拦截
这里有一个地方需要考虑,如果用户未成功登录或其他都不做日志记录,所以需要在用户登录成功时设置一个flag用于标记用户登录成功
xss防御
说到安全不得不吐槽下被攻击过的过往
利用nat123将本机作为服务器,成为肉鸡,出现一个新用户->利用富文本编辑漏洞,攻击力数据库->利用redis默认6379又未设置密码,key被删光->未做反爬虫处理,被当做请求实验,造成服务器压力大,最后挂掉->利用es默认配置,数据直接被黑,留下黑客邮箱交钱给数据->经常被xss攻击,植入脚本。
幸亏是个人的,没有多大损失,由此可见。系统的安全性也是必须要考虑的。
目前采取了两种方式,直接利用 XssFilter(具体见xss包下类)过滤所有请求,是内容安全,但是这样做会把富文本的表情也给过滤掉。
采取了另一种方案,在前端利用开源的xss防御过滤文本类容,然后在后端通过jsoup进行xss防御