x-blog之权限模块简单说明

前言

目前该模块仍然沿袭旧版本的设计,由于个人经验和能力的不足,所以存在很多隐患和漏洞,请谅解。
权限模块总共五张表,用户-角色-权限,并且为了方便,系统是基于角色控制用户操作权限的。
而真实的情况应该是很多张权限表,并且用户个人信息与用户权限信息应该是独立的,比如tuser不涉及用户的个人信息的,而core_user_base(表名随意)记录用户信息,而其中的用户有哪些信息应该在记录在一张表cfg_user_base_info中,目前登录是系统内单独注册的,应该有第三方登录,如qq,微信等,目前为涉及,请谅解,后续有能力在搞。
另外权限是由shiro控制,并且每次都需要从数据库进行验证,合理的应该是初始化到redis。

数据库设计

t_user(用户表)
Alt text
其中user_state是用户拉黑状态,eCode是用户最后注册成功的邮箱激活码

t_role(角色表)
Alt text

t_user_role(用户-角色关系表)
Alt text

t_permisssion(权限表)
Alt text

t_role_permisssion(角色-权限关系表)
Alt text

t_email_code(邮箱记录表)
Alt text
该表主要用于验证邮箱是否已被注册和记录最后一次邮箱的激活码

用户注册简单说明

该实现方法仅作为本项目娱乐使用,用户点击注册,第一个页面包含用户名和邮箱,首先对用户名进行重名校验,邮箱是否已被注册,第二个页面点击发送验证码,如果成功发送出去(一般在垃圾箱),然后在邮箱记录表中进行记录,然后前端判断激活码是否正确。
旧版本这里将邮箱发送做成微服务,利用activeMq进行一对一发送,同时,这里邮箱激活码可以改成链接带上激活码参数更优
最后一步填写相关信息,注册成功后跳转至个人信息控制页

登录模块

旧版本做的很不合理,应该利用redis做成单点登录。目前就是单击通过用户名,密码登录。
利用shiro控制权限认证,在进行权限认证的时候,需要进行黑名单过滤和登录日志统计
1.黑名单 即利用用户状态判定该用户状态是否被锁定,这里有一个bug未解决,就是用户输入不存在的用户名称时,这里 String nickName = request.getParameter(“nickName”);为空,直接返回fasle,前端通过ajax无法判断,所以无任何改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* <p>
* 过滤黑名单用户
* </p>
*
* @author slycmiaoxi
* @since 2019-06-27
*/
public class LockUserFilter extends AccessControlFilter {
@Autowired
private ITUserService itUserService;
private String loginUrl = "/unauthorized.jsp";
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
throws Exception {
String nickName = request.getParameter("nickName");
TUser user = itUserService.getUserByName(nickName);
if (null == user || user.getUserState() == 0) {
return false;
}
return true;
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
throws Exception {
WebUtils.issueRedirect(request, response, loginUrl);
return false;
}
}

2.登录日志统计
Alt text
主要利用一个过滤器继续aop拦截
这里有一个地方需要考虑,如果用户未成功登录或其他都不做日志记录,所以需要在用户登录成功时设置一个flag用于标记用户登录成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
HttpServletRequest httpRequest = (HttpServletRequest)request;
Date time_begin = new Date();
chain.doFilter(request, response);
Date time_end = new Date();
// 成功登录
if (request.getAttribute("flag") != null) {
// 请求耗时
long i = (long)((time_end.getTime() - time_begin.getTime()));
TLoginLog tLoginLog = generatorLogger(httpRequest, i);
iTLoginLogService.insert(tLoginLog);
}
else {
log.error("login fail !");
}
}

xss防御

说到安全不得不吐槽下被攻击过的过往
利用nat123将本机作为服务器,成为肉鸡,出现一个新用户->利用富文本编辑漏洞,攻击力数据库->利用redis默认6379又未设置密码,key被删光->未做反爬虫处理,被当做请求实验,造成服务器压力大,最后挂掉->利用es默认配置,数据直接被黑,留下黑客邮箱交钱给数据->经常被xss攻击,植入脚本。
幸亏是个人的,没有多大损失,由此可见。系统的安全性也是必须要考虑的。
目前采取了两种方式,直接利用 XssFilter(具体见xss包下类)过滤所有请求,是内容安全,但是这样做会把富文本的表情也给过滤掉。
采取了另一种方案,在前端利用开源的xss防御过滤文本类容,然后在后端通过jsoup进行xss防御

热评文章