diff --git a/new_intall_20180222.sql b/new_intall_20180223.sql
similarity index 94%
rename from new_intall_20180222.sql
rename to new_intall_20180223.sql
index 2f3086592..4ec65ad7d 100644
--- a/new_intall_20180222.sql
+++ b/new_intall_20180223.sql
@@ -49,8 +49,8 @@ create table sys_user (
-- ----------------------------
-- 初始化-用户信息表数据
-- ----------------------------
-insert into sys_user values('1', '1', 'admin', '阳宗专', 'yzz_ivy@163.com', '1517911213', '172eee54aa664e9dd0536b063796e54e', '', 0, '维护中', '2018-01-01');
-insert into sys_user values('2', '1', 'eptok', '银盛通信', 'ys@eptok.com', '15220051213', '172eee54aa664e9dd0536b063796e54e', '', 3, '黑名单', '2018-01-01');
+insert into sys_user values('1', '1', 'admin', '阳宗专', 'yzz_ivy@163.com', '15017911213', '172eee54aa664e9dd0536b063796e54e', '', 0, '维护中', '2018-01-01');
+insert into sys_user values('2', '1', 'ry', '阳若依', 'ry@163.com', '15220051213', '2f59d63eddd54f3977d6fe25aec8b2bc', '', 1, '锁定中', '2018-01-01');
@@ -234,14 +234,14 @@ insert into sys_code values('system-operlog-status', '1', '失败', '', '', '2')
-- ----------------------------
drop table if exists sys_logininfor;
create table sys_logininfor (
- info_id int(11) not null auto_increment comment '在线登录ID',
- opername varchar(50) default '' comment '用户账号',
+ info_id int(11) not null auto_increment comment '访问ID',
+ login_name varchar(50) default '' comment '登录名',
status int(1) default 0 comment '登录状态 0成功 1失败',
ipaddr varchar(50) default '' comment '登录IP地址',
browser varchar(50) default '' comment '浏览器类型',
os varchar(50) default '' comment '操作系统',
msg varchar(255) default '' comment '提示消息',
- logondate varchar(30) default null comment '访问时间',
+ logondate timestamp default current_timestamp comment '访问时间',
primary key (info_id)
) engine=innodb auto_increment=100 default charset=utf8;
diff --git a/pom.xml b/pom.xml
index 6d179d7fe..882ca7040 100644
--- a/pom.xml
+++ b/pom.xml
@@ -129,6 +129,12 @@
net.sf.ehcache
ehcache
+
+
+ eu.bitwalker
+ UserAgentUtils
+ 1.19
+
org.quartz-scheduler
diff --git a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
index e1b95e5b9..c2119f3ca 100644
--- a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
@@ -104,7 +104,7 @@ public class ShiroConfig
filterChainDefinitionMap.put("/logout", "logout");
// 系统权限列表
MenuServiceImpl menuService = SpringUtils.getBean(MenuServiceImpl.class);
- filterChainDefinitionMap.putAll(menuService.findAllPerms());
+ filterChainDefinitionMap.putAll(menuService.selectPermsAll());
// 所有请求需要认证
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
diff --git a/src/main/java/com/ruoyi/framework/constant/CommonConstant.java b/src/main/java/com/ruoyi/framework/constant/CommonConstant.java
new file mode 100644
index 000000000..7f938c2eb
--- /dev/null
+++ b/src/main/java/com/ruoyi/framework/constant/CommonConstant.java
@@ -0,0 +1,31 @@
+package com.ruoyi.framework.constant;
+
+/**
+ * 通用常量信息
+ *
+ * @author yangzz
+ */
+public class CommonConstant
+{
+
+ /**
+ * 通用成功标识
+ */
+ public static final String SUCCESS = "0";
+
+ /**
+ * 通用失败标识
+ */
+ public static final String FAIL = "1";
+
+ /**
+ * 登录成功
+ */
+ public static final String LOGIN_SUCCESS = "Success";
+
+ /**
+ * 登录失败
+ */
+ public static final String LOGIN_FAIL = "Error";
+
+}
diff --git a/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java b/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java
index 116411cac..3278441e1 100644
--- a/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java
+++ b/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java
@@ -1,18 +1,14 @@
package com.ruoyi.framework.core.dao;
import java.util.List;
-
import javax.annotation.Resource;
-
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import com.ruoyi.project.shiro.exception.base.DaoException;
-import com.ruoyi.project.shiro.realm.UserRealm;
/**
* 数据DAO层通用数据处理
@@ -21,7 +17,7 @@ import com.ruoyi.project.shiro.realm.UserRealm;
*/
public class DynamicObjectBaseDao
{
- private static final Logger log = LoggerFactory.getLogger(UserRealm.class);
+ private static final Logger log = LoggerFactory.getLogger(DynamicObjectBaseDao.class);
@Resource(name = "sqlSessionTemplate")
private SqlSessionTemplate sqlSessionTemplate;
diff --git a/src/main/java/com/ruoyi/project/shiro/common/utils/SystemLogUtils.java b/src/main/java/com/ruoyi/project/shiro/common/utils/SystemLogUtils.java
deleted file mode 100644
index 7081d2370..000000000
--- a/src/main/java/com/ruoyi/project/shiro/common/utils/SystemLogUtils.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//package com.ruoyi.project.shiro.common.utils;
-//
-//import javax.servlet.http.HttpServletRequest;
-//
-//import org.apache.shiro.SecurityUtils;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.web.context.request.RequestContextHolder;
-//import org.springframework.web.context.request.ServletRequestAttributes;
-//
-//import com.ruoyi.common.utils.spring.SpringUtils;
-//
-///**
-// * 记录用户日志信息
-// *
-// * @author y
-// */
-//public class SystemLogUtils
-//{
-//
-// private static final Logger SYS_USER_LOGGER = LoggerFactory.getLogger("sys-user");
-// private static final String LOGIN_SUCCESS = "loginSuccess", LOGIN_FAIL = "loginError";
-// @Autowired
-// private static IUserLogService userLogService;
-//
-// private static synchronized void injectUserLogService()
-// {
-// userLogService = (IUserLogService) SpringUtils.getBean("userLogService");
-// }
-//
-// /**
-// * 记录格式 [ip][用户名][操作][错误消息]
-// *
-// * 注意操作如下: loginError 登录失败 loginSuccess 登录成功 passwordError 密码错误 changePassword 修改密码 changeStatus 修改状态
-// *
-// * @param username
-// * @param op
-// * @param msg
-// * @param args
-// */
-// public static void log(String username, String op, String msg, Object... args)
-// {
-// StringBuilder s = new StringBuilder();
-// s.append(LogUtils.getBlock(getIp()));
-// s.append(LogUtils.getBlock(username));
-// s.append(LogUtils.getBlock(op));
-// s.append(LogUtils.getBlock(msg));
-//
-// SYS_USER_LOGGER.info(s.toString(), args);
-//
-// if (LOGIN_SUCCESS.equals(op))
-// {
-// saveOpLog(username, msg, CommonConstant.SUCCESS);
-// }
-// else if (LOGIN_FAIL.equals(op))
-// {
-// saveOpLog(username, msg, CommonConstant.FAIL);
-// }
-// else
-// {
-// // 暂不处理
-// }
-//
-// }
-//
-// public static Object getIp()
-// {
-// return SecurityUtils.getSubject().getSession().getHost();
-// }
-//
-// /**
-// * 得到request对象
-// */
-// public static HttpServletRequest getRequest()
-// {
-// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
-// .getRequest();
-//
-// return request;
-// }
-//
-// public static void saveOpLog(String username, String message, String status)
-// {
-// if (userLogService == null)
-// {
-// injectUserLogService();
-// }
-//
-// UserAgent userAgent = UserAgent.parseUserAgentString(getRequest().getHeader("User-Agent"));
-// String os = userAgent.getOperatingSystem().getName(); // 获取客户端操作系统
-// String browser = userAgent.getBrowser().getName(); // 获取客户端浏览器
-//
-// UserLog userLog = new UserLog();
-// userLog.setUserName(username);
-// userLog.setStatus(status);
-// userLog.setLoginIP(String.valueOf(getIp()));
-// userLog.setBrowser(browser);
-// userLog.setOs(os);
-// userLog.setMsg(message);
-// userLogService.addUserlog(userLog);
-// }
-//}
diff --git a/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java b/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java
index e48aad2dd..bfb41c33d 100644
--- a/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java
+++ b/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java
@@ -3,13 +3,16 @@ package com.ruoyi.project.shiro.realm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
+import com.ruoyi.framework.constant.CommonConstant;
import com.ruoyi.project.shiro.common.UserConstants;
+import com.ruoyi.project.shiro.common.utils.MessageUtils;
import com.ruoyi.project.shiro.exception.UserBlockedException;
import com.ruoyi.project.shiro.exception.UserNotExistsException;
import com.ruoyi.project.shiro.exception.UserPasswordNotMatchException;
import com.ruoyi.project.shiro.service.PasswordService;
import com.ruoyi.project.system.user.domain.User;
import com.ruoyi.project.system.user.service.IUserService;
+import com.ruoyi.project.util.SystemLogUtils;
/**
* 登录校验方法
@@ -33,12 +36,14 @@ public class LoginService
// 用户名或密码为空 错误
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
{
+ SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new UserNotExistsException();
}
// 密码如果不在指定范围内 错误
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
{
+ SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("user.password.not.match"));
throw new UserPasswordNotMatchException();
}
@@ -46,6 +51,7 @@ public class LoginService
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH)
{
+ SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("user.password.not.match"));
throw new UserPasswordNotMatchException();
}
@@ -54,6 +60,7 @@ public class LoginService
if (user == null)
{
+ SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("user.not.exists"));
throw new UserNotExistsException();
}
@@ -61,8 +68,11 @@ public class LoginService
if (UserConstants.BLOCKED.equals(user.getStatus()))
{
+ SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRefuseDes()));
throw new UserBlockedException(user.getRefuseDes());
}
+
+ SystemLogUtils.log(username, CommonConstant.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
return user;
}
diff --git a/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java b/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java
index f3b221a03..b4d8fb406 100644
--- a/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java
+++ b/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java
@@ -51,7 +51,7 @@ public class UserRealm extends AuthorizingRealm
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
{
Long userId = ShiroUtils.getUserId();
- Set perms = menuService.findPermsByUserId(userId);
+ Set perms = menuService.selectPermsByUserId(userId);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
if (StringTools.isNotEmpty(perms))
{
diff --git a/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java b/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java
index c8346f719..18ce1d909 100644
--- a/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java
+++ b/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java
@@ -7,10 +7,12 @@ import org.apache.shiro.cache.CacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
+import com.ruoyi.framework.constant.CommonConstant;
import com.ruoyi.project.shiro.common.utils.Md5Utils;
import com.ruoyi.project.shiro.exception.UserPasswordNotMatchException;
import com.ruoyi.project.shiro.exception.UserPasswordRetryLimitExceedException;
import com.ruoyi.project.system.user.domain.User;
+import com.ruoyi.project.util.SystemLogUtils;
/**
* 登录密码方法
@@ -37,28 +39,30 @@ public class PasswordService
public void validate(User user, String password)
{
- String username = user.getUserName();
+ String loginName = user.getLoginName();
- AtomicInteger retryCount = loginRecordCache.get(username);
+ AtomicInteger retryCount = loginRecordCache.get(loginName);
if (retryCount == null)
{
retryCount = new AtomicInteger(0);
- loginRecordCache.put(username, retryCount);
+ loginRecordCache.put(loginName, retryCount);
}
if (retryCount.incrementAndGet() > Integer.valueOf(maxRetryCount).intValue())
{
+ SystemLogUtils.log(loginName, CommonConstant.LOGIN_FAIL, "密码输入错误次数太多禁止登录,最大{}次!", maxRetryCount);
throw new UserPasswordRetryLimitExceedException(Integer.valueOf(maxRetryCount).intValue());
}
if (!matches(user, password))
{
- loginRecordCache.put(username, retryCount);
+ SystemLogUtils.log(loginName, CommonConstant.LOGIN_FAIL, "密码错误!密码:{},重试计数:{}", password, retryCount);
+ loginRecordCache.put(loginName, retryCount);
throw new UserPasswordNotMatchException();
}
else
{
- clearLoginRecordCache(username);
+ clearLoginRecordCache(loginName);
}
}
diff --git a/src/main/java/com/ruoyi/project/system/logininfor/dao/ILogininforDao.java b/src/main/java/com/ruoyi/project/system/logininfor/dao/ILogininforDao.java
new file mode 100644
index 000000000..026c760ae
--- /dev/null
+++ b/src/main/java/com/ruoyi/project/system/logininfor/dao/ILogininforDao.java
@@ -0,0 +1,18 @@
+package com.ruoyi.project.system.logininfor.dao;
+
+import com.ruoyi.project.system.logininfor.domain.Logininfor;
+
+/**
+ * 系统访问日志情况信息 数据层
+ *
+ * @author y
+ */
+public interface ILogininforDao
+{
+ /**
+ * 新增系统登录日志
+ *
+ * @param logininfor 访问日志对象
+ */
+ public void insertLogininfor(Logininfor logininfor);
+}
diff --git a/src/main/java/com/ruoyi/project/system/logininfor/dao/LogininforDaoImpl.java b/src/main/java/com/ruoyi/project/system/logininfor/dao/LogininforDaoImpl.java
new file mode 100644
index 000000000..4a499d7d1
--- /dev/null
+++ b/src/main/java/com/ruoyi/project/system/logininfor/dao/LogininforDaoImpl.java
@@ -0,0 +1,18 @@
+package com.ruoyi.project.system.logininfor.dao;
+
+import org.springframework.stereotype.Repository;
+
+import com.ruoyi.framework.core.dao.DynamicObjectBaseDao;
+import com.ruoyi.project.system.logininfor.domain.Logininfor;
+
+@Repository("logininforDao")
+public class LogininforDaoImpl extends DynamicObjectBaseDao implements ILogininforDao
+{
+
+ @Override
+ public void insertLogininfor(Logininfor logininfor)
+ {
+ this.save("SystemLogininforMapper.insertLogininfor", logininfor);
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/project/system/logininfor/domain/Logininfor.java b/src/main/java/com/ruoyi/project/system/logininfor/domain/Logininfor.java
new file mode 100644
index 000000000..58c94f57a
--- /dev/null
+++ b/src/main/java/com/ruoyi/project/system/logininfor/domain/Logininfor.java
@@ -0,0 +1,119 @@
+package com.ruoyi.project.system.logininfor.domain;
+
+import java.io.Serializable;
+
+/**
+ * 系统访问日志情况信息 sys_logininfor
+ *
+ * @author yangzz
+ */
+public class Logininfor implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ // ID
+ private Integer infoId;
+ // 用户账号
+ private String loginName;
+ // 登录状态 0成功 1失败
+ private String status;
+ // 登录IP地址
+ private String ipaddr;
+ // 浏览器类型
+ private String browser;
+ // 操作系统
+ private String os;
+ // 提示消息
+ private String msg;
+ // 访问时间
+ private String loginTime;
+
+ public Integer getInfoId()
+ {
+ return infoId;
+ }
+
+ public void setInfoId(Integer infoId)
+ {
+ this.infoId = infoId;
+ }
+
+ public String getLoginName()
+ {
+ return loginName;
+ }
+
+ public void setLoginName(String loginName)
+ {
+ this.loginName = loginName;
+ }
+
+ public String getStatus()
+ {
+ return status;
+ }
+
+ public void setStatus(String status)
+ {
+ this.status = status;
+ }
+
+ public String getIpaddr()
+ {
+ return ipaddr;
+ }
+
+ public void setIpaddr(String ipaddr)
+ {
+ this.ipaddr = ipaddr;
+ }
+
+ public String getBrowser()
+ {
+ return browser;
+ }
+
+ public void setBrowser(String browser)
+ {
+ this.browser = browser;
+ }
+
+ public String getOs()
+ {
+ return os;
+ }
+
+ public void setOs(String os)
+ {
+ this.os = os;
+ }
+
+ public String getMsg()
+ {
+ return msg;
+ }
+
+ public void setMsg(String msg)
+ {
+ this.msg = msg;
+ }
+
+ public String getLoginTime()
+ {
+ return loginTime;
+ }
+
+ public void setLoginTime(String loginTime)
+ {
+ this.loginTime = loginTime;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "{\"infoId\":\"" + infoId + "\",\"loginName\":\"" + loginName + "\",\"status\":\"" + status
+ + "\",\"ipaddr\":\"" + ipaddr + "\",\"browser\":\"" + browser + "\",\"os\":\"" + os + "\",\"msg\":\""
+ + msg + "\",\"loginTime\":\"" + loginTime + "\"} ";
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/logininfor/service/ILogininforService.java b/src/main/java/com/ruoyi/project/system/logininfor/service/ILogininforService.java
new file mode 100644
index 000000000..d0e5d3564
--- /dev/null
+++ b/src/main/java/com/ruoyi/project/system/logininfor/service/ILogininforService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.project.system.logininfor.service;
+
+import com.ruoyi.project.system.logininfor.domain.Logininfor;
+
+/**
+ * 系统访问日志情况信息 服务层
+ *
+ * @author yangzz
+ */
+public interface ILogininforService
+{
+
+ /**
+ * 新增系统登录日志
+ *
+ * @param logininfor 访问日志对象
+ */
+ public void insertLogininfor(Logininfor logininfor);
+}
diff --git a/src/main/java/com/ruoyi/project/system/logininfor/service/LogininforServiceImpl.java b/src/main/java/com/ruoyi/project/system/logininfor/service/LogininforServiceImpl.java
new file mode 100644
index 000000000..989cf5ddd
--- /dev/null
+++ b/src/main/java/com/ruoyi/project/system/logininfor/service/LogininforServiceImpl.java
@@ -0,0 +1,29 @@
+package com.ruoyi.project.system.logininfor.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.system.logininfor.dao.ILogininforDao;
+import com.ruoyi.project.system.logininfor.domain.Logininfor;
+
+/**
+ * 系统访问日志情况信息 服务层处理
+ *
+ * @author yangzz
+ */
+@Service("logininforService")
+public class LogininforServiceImpl implements ILogininforService
+{
+
+ @Autowired
+ private ILogininforDao logininforDao;
+
+ /**
+ * 新增系统登录日志
+ *
+ * @param logininfor 访问日志对象
+ */
+ public void insertLogininfor(Logininfor logininfor)
+ {
+ logininforDao.insertLogininfor(logininfor);
+ }
+}
diff --git a/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java b/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java
index f231391d0..c325a74d8 100644
--- a/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java
+++ b/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java
@@ -17,7 +17,7 @@ public interface IMenuDao
* @param userId 用户ID
* @return 菜单列表
*/
- public List