新增redis密码输入次数过多锁定账号

master
ALW 3 years ago
parent 001a040db3
commit 783bb6a7ce

@ -158,18 +158,18 @@
<build>
<finalName>power</finalName>
<plugins>
<!--<plugin>-->
<!--&lt;!&ndash; 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 &ndash;&gt;-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-compiler-plugin</artifactId>-->
<!--<version>3.1</version>-->
<!--<configuration>-->
<!--&lt;!&ndash; 一般而言target与source是保持一致的但是有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk源代码中不能使用低版本jdk中不支持的语法)会存在target不同于source的情况 &ndash;&gt;-->
<!--<source>1.8</source> &lt;!&ndash; 源代码使用的JDK版本 &ndash;&gt;-->
<!--<target>1.8</target> &lt;!&ndash; 需要生成的目标class文件的编译版本 &ndash;&gt;-->
<!--<encoding>UTF-8</encoding>&lt;!&ndash; 字符集编码 &ndash;&gt;-->
<!--</configuration>-->
<!--</plugin>-->
<plugin>
<!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 一般而言target与source是保持一致的但是有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk源代码中不能使用低版本jdk中不支持的语法)会存在target不同于source的情况 -->
<source>1.8</source> <!-- 源代码使用的JDK版本 -->
<target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
<encoding>UTF-8</encoding><!-- 字符集编码 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>

@ -1,17 +1,19 @@
package com.manage.bean;
public class LoginVoRedis {
private String username;
private String userName;
private String password;
private int loginFailureCount;
private String loginTime;
public String getUsername() {
return username;
public String getUserName() {
return userName;
}
public void setUsername(String username) {
this.username = username;
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
@ -41,7 +43,7 @@ public class LoginVoRedis {
@Override
public String toString() {
return "LoginVo_Redis{" +
"username='" + username + '\'' +
"username='" + userName + '\'' +
", password='" + password + '\'' +
", loginFailureCount=" + loginFailureCount +
", loginTime='" + loginTime + '\'' +

@ -62,167 +62,147 @@ public class LoginController {
@Value("${POWER_PORT}")
private String POWER_PORT;
@RequestMapping(value = "login",method = RequestMethod.GET)
public String toLogin(Model model){
@RequestMapping(value = "login", method = RequestMethod.GET)
public String toLogin(Model model) {
Power_Login_Set loginSet = powerLoginSetMapper.selectByPrimaryKey(1);
model.addAttribute("loginSet",loginSet);
model.addAttribute("loginSet", loginSet);
CacheManager.addExcCount("noExc");
return "loginDir/login";
}
@RequestMapping(value = "login",method = RequestMethod.POST)
@RequestMapping(value = "login", method = RequestMethod.POST)
@ResponseBody
public Msg login(Power_User powerUser,HttpServletResponse response, HttpServletRequest request,Model model){
LoginVoRedis loginVo = new LoginVoRedis();
Msg msg = new Msg();
public Msg login(Power_User powerUser, HttpServletResponse response, HttpServletRequest request, Model model) {
String userName = powerUser.getUserName();
String userPwd = powerUser.getUserPwd();
if (!userName.equals("admin")){
String s ="00" + userName;
if (!userName.equals("admin")) {
String s = "00" + userName;
powerUser.setUserName(s);
}
loginVo.setUsername(userName);
loginVo.setPassword(userPwd);
Date date = new Date();
SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
loginVo.setLoginTime(sdFormatter.toString());
Jedis redis = JedisPoolUtil.getJedisPoolInstance().getResource();
String userInfo = redis.get(userName);
if (userInfo==null){
loginVo.setLoginFailureCount(0);
redis.set(userName, JSONObject.toJSONString(loginVo));
userInfo = redis.get(userName);
}
JSON json =JSONObject.parseObject(userInfo);
System.out.println(json);
LoginVoRedis userLoginInfo = JSONObject.toJavaObject(json, LoginVoRedis.class);
int loginFailCount = userLoginInfo.getLoginFailureCount();
if (loginFailCount >= 5 ) {
String errorPwsCount = "0";
if (userInfo == null) {
redis.set(userName, errorPwsCount);
}
try {
Power_UserVo user = powerUserService.findPowerUserByUserNameAndUserPwd(powerUser);
//添加进操作日志
Power_Log log = new Power_Log();
if(user != null){
//存session密码置空
//是否记住密码功能
MyCookieUtil.remember(request, response);
//设置token缓存
String token = UUID.randomUUID().toString();
CacheManager.addExcCount("noExc");
List<Power_Menu> list = null;
List<User_Dept_Menu> menuList = new ArrayList<>();
Set<String> menus = new LinkedHashSet<>();
if (user.getRoleId().equals(0) || user.getRoleId().equals(-100)) {
list = powerMenuService.queryAllPowerMenu(null,user.getRoleId());
} else {
list = powerMenuService.selectUserAndRoleMenuListPower(user.getUserId(),null);
}
if(null != list && !list.isEmpty()){
for (Power_Menu powerMenu : list) {
User_Dept_Menu deptMenu = new User_Dept_Menu();
String menuUrl = powerMenu.getMenuUrl();
if (StringUtils.isNotBlank(menuUrl)) {
BeanUtils.copyProperties(powerMenu, deptMenu);
deptMenu.setMethodParent(powerMenu.getParentId());
menuList.add(deptMenu);
int i = Integer.parseInt(redis.get(userName));
if (i < 5) {
try {
Power_UserVo user = powerUserService.findPowerUserByUserNameAndUserPwd(powerUser);
//添加进操作日志
Power_Log log = new Power_Log();
if (user != null) {
//存session密码置空
//是否记住密码功能
MyCookieUtil.remember(request, response);
//设置token缓存
String token = UUID.randomUUID().toString();
CacheManager.addExcCount("noExc");
List<Power_Menu> list = null;
List<User_Dept_Menu> menuList = new ArrayList<>();
Set<String> menus = new LinkedHashSet<>();
if (user.getRoleId().equals(0) || user.getRoleId().equals(-100)) {
list = powerMenuService.queryAllPowerMenu(null, user.getRoleId());
} else {
list = powerMenuService.selectUserAndRoleMenuListPower(user.getUserId(), null);
}
if (null != list && !list.isEmpty()) {
for (Power_Menu powerMenu : list) {
User_Dept_Menu deptMenu = new User_Dept_Menu();
String menuUrl = powerMenu.getMenuUrl();
if (StringUtils.isNotBlank(menuUrl)) {
BeanUtils.copyProperties(powerMenu, deptMenu);
deptMenu.setMethodParent(powerMenu.getParentId());
menuList.add(deptMenu);
}
if (StringUtils.isNotBlank(powerMenu.getMethod())) {
menus.add(powerMenu.getMenuUrl());
}
}
if (StringUtils.isNotBlank(powerMenu.getMethod())) {
menus.add(powerMenu.getMenuUrl());
}
user.setMenuList(menuList);
user.setMenus(menus);
//设置科室
StringBuilder powerDepts = new StringBuilder();
List<Power_Dept> powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId());
for (int j = 0; j < powerDeptsList.size(); j++) {
if (j < powerDeptsList.size() - 1) {
powerDepts.append(powerDeptsList.get(j).getDeptName()).append(",");
} else {
powerDepts.append(powerDeptsList.get(j).getDeptName());
}
}
}
user.setMenuList(menuList);
user.setMenus(menus);
//设置科室
StringBuilder powerDepts = new StringBuilder();
List<Power_Dept> powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId());
for(int j=0;j<powerDeptsList.size();j++){
if(j<powerDeptsList.size()-1){
powerDepts.append(powerDeptsList.get(j).getDeptName()).append(",");
}else{
powerDepts.append(powerDeptsList.get(j).getDeptName());
Integer roleId = user.getRoleId();
if (null != roleId && roleId != 0 && roleId != -100) {
user.setRemark(powerDepts.toString());
}
//清除用户登录错误次数缓存
CacheManager.clearOnly(powerUser.getUserName());
//设置进缓存
CacheManager.putCache(token, new Cache(user, System.currentTimeMillis(), TOKEN_EXPIRE_TIME * 1000));
ActionScopeUtils.setSessionAttribute("token", token, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
ActionScopeUtils.setSessionAttribute("CURRENT_USER", user, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
Power_User user1 = (Power_User) request.getSession().getAttribute("CURRENT_USER");
//单点登录跳转
String url = "";
if (sysFlag == 2) {
url = EMRMEDICALRECORD_URLHEAD + "/login?token=" + token + "&userName=" + user.getUserName() + "&flag=1";
} else {
//获取本地端口
int POWER_PORT = request.getLocalPort();
url = "http://" + ip + ":" + POWER_PORT + "/power/gatewayPage";
}
redis.del(userName);
return Msg.success().add("url", url);
} else {
//登录失败
Integer wrongNum = 1;
Cache cache = CacheManager.getCacheInfo(powerUser.getUserName());
if (cache != null) {
//缓存中错误次数
Integer currentNum = (Integer) cache.getValue();
//叠加1
wrongNum += currentNum;
}
//添加缓存
CacheManager.putCache(powerUser.getUserName(), new Cache(wrongNum));
log.setCreater(powerUser.getUserName());
log.setLogTitle("登录");
log.setLogContent("用户密码错误");
log.setRemark("已错误【" + wrongNum + "】次");
logService.insert(log);
request.setAttribute("msg", "用户名或密码不正确");
redis.incr(userName);
return Msg.failUser();
}
Integer roleId = user.getRoleId();
if(null != roleId && roleId != 0 && roleId != -100){
user.setRemark(powerDepts.toString());
}
//清除用户登录错误次数缓存
CacheManager.clearOnly(powerUser.getUserName());
//设置进缓存
CacheManager.putCache(token,new Cache(user,System.currentTimeMillis(),TOKEN_EXPIRE_TIME*1000));
ActionScopeUtils.setSessionAttribute("token",token,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
ActionScopeUtils.setSessionAttribute("CURRENT_USER",user,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
Power_User user1 = (Power_User)request.getSession().getAttribute("CURRENT_USER");
//单点登录跳转
String url = "";
if(sysFlag == 2){
url = EMRMEDICALRECORD_URLHEAD+"/login?token="+token+"&userName="+user.getUserName()+"&flag=1";
}else{
//获取本地端口
int POWER_PORT = request.getLocalPort();
url = "http://"+ip+":"+POWER_PORT+"/power/gatewayPage";
}
redis.set(userName, JSONObject.toJSONString(loginVo));
request.getSession().setAttribute("user",loginVo);
return Msg.success().add("url",url);
}else{
//登录失败
Integer wrongNum = 1;
Cache cache = CacheManager.getCacheInfo(powerUser.getUserName());
if(cache != null){
//缓存中错误次数
Integer currentNum = (Integer)cache.getValue();
//叠加1
wrongNum += currentNum;
}
//添加缓存
CacheManager.putCache(powerUser.getUserName(),new Cache(wrongNum));
log.setCreater(powerUser.getUserName());
log.setLogTitle("登录");
log.setLogContent("用户密码错误");
log.setRemark("已错误【"+wrongNum+"】次");
logService.insert(log);
request.setAttribute("msg", "用户名或密码不正确");
loginFailCount ++;
loginVo.setLoginFailureCount(loginFailCount);
redis.set(userName,JSONObject.toJSONString(loginVo));
request.getSession().setAttribute("user",loginVo);
return Msg.failUser();
} catch (Exception e) {
e.printStackTrace();
CacheManager.addExcCount("exc");
}
}catch (Exception e){
e.printStackTrace();
CacheManager.addExcCount("exc");
} else {
//失败次数大于五时锁十五分钟
redis.setex(userName, 900, i + "");
return Msg.failUser2();
}
return null;
}
@RequestMapping("refuse")
public String refuse(){
public String refuse() {
return "refuse";
}
//获取session所剩时间
@RequestMapping(value = "getSessionRemainingTime",method = RequestMethod.GET,produces = {"text/json;charset=UTF-8"})
@RequestMapping(value = "getSessionRemainingTime", method = RequestMethod.GET, produces = {"text/json;charset=UTF-8"})
@ResponseBody
public String getSessionRemainingTime(HttpServletRequest request)throws Exception{
public String getSessionRemainingTime(HttpServletRequest request) throws Exception {
long lastAccessTime = 0L;
String sessionId = request.getSession().getId();
Object attribute = request.getSession().getAttribute(sessionId);
if(null != attribute){
lastAccessTime = (long)attribute;
return JSON.toJSONString(TOKEN_EXPIRE_TIME-(System.currentTimeMillis()-lastAccessTime));
}else{
if (null != attribute) {
lastAccessTime = (long) attribute;
return JSON.toJSONString(TOKEN_EXPIRE_TIME - (System.currentTimeMillis() - lastAccessTime));
} else {
return null;
}
}

@ -168,7 +168,7 @@ public class UserController {
ServletRequestAttributes attr=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request =attr.getRequest();
Power_UserVo powerUser = powerUserService.selectByPrimaryKey(userId);
powerUser.setUserPwd("EUwQTRBEEE0WFxJERRVCREVEEkYQEBFBTUJATU1GR0I=");
powerUser.setUserPwd("R0QXEUNFFUNHFhAQTURMF0dNQUEVTUQRTBJDQEZNERI=");
powerUserService.updateByPrimaryKeySelective(powerUser,request);
CacheManager.addExcCount("noExc");
return Msg.success();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 496 KiB

After

Width:  |  Height:  |  Size: 661 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@ -1,10 +1,7 @@
/**
* Created by ljx on 2019/4/25.
*/
$(function(){
$(function () {
//cookie数据保存格式是key=value;key=value;形式loginInfo为保存在cookie中的key值具体看controller代码
/*if(str != ""){
var userName = str.split("#")[0];
@ -28,7 +25,7 @@ $(function(){
return "";
}*/
$("#forgetPwd").on("click",function(){
$("#forgetPwd").on("click", function () {
alert("请联系管理员进行修改密码!");
});
@ -36,8 +33,6 @@ $(function(){
});
var banar = document.getElementById('banar');
var txt = document.getElementById('txt');
var sub = document.getElementById('sub');
@ -47,8 +42,9 @@ var allchar = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e",
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z"];
var result;
function randomChar() {
result = "";//创建空的字符串,方便等下接收值
result = "";//创建空的字符串,方便等下接收值
//循环找出4的字符
for (var i = 0; i < 4; i++) {
//随机生成一个0-61的数字
@ -61,15 +57,15 @@ function randomChar() {
banar.innerHTML = result;
//点击验证按钮,判断我们输入的值和随机生成的值是否一样?
//一样就弹出验证成功,不一样就弹出验证错误。
sub.onclick = function () {
if (txt.value == result) {
alert("验证成功!!!");
} else {
alert("验证错误!!!");
randomChar();//如果错误执行randomChar方法重新随机生成4个字符
txt.value = "";//如果错误,我们输入的验证码等于空,方便我们再次输入
}
};
// sub.onclick = function () {
// if (txt.value == result) {
// alert("验证成功!!!");
// } else {
// alert("验证错误!!!");
// randomChar();//如果错误执行randomChar方法重新随机生成4个字符
// txt.value = "";//如果错误,我们输入的验证码等于空,方便我们再次输入
// }
// };
}
randomChar();
@ -83,6 +79,7 @@ function login() {
var userName = $("#userName").val();
var userPwd = $("#userPwd").val();
var txt = $("#txt").val();
userPwd = hex_hmac_md5(userPwd, userPwd);
var rememberMeChecked = $("input[type='checkbox']").is(':checked');
var rememberMe = '';
if (rememberMeChecked) {
@ -97,111 +94,112 @@ function login() {
if (txt == '') {
toastr.warning("验证码不能为空!");
} else {
if (result != txt) {
toastr.warning("验证码错误!")
randomChar();
} else {
$.ajax({
type: "POST",
url: path + "/login",
data: {userName: userName, userPwd: userPwd, rememberMe: rememberMe},
dataType: 'json',
success: function (data) {
if (result==txt) {
if (data.code == 100) {
window.location.href = data.extend.url;
} else {
toastr.warning(data.extend.msg);
}
}else {
toastr.warning("验证码错误!!!");
}
if (data.code == 100) {
window.location.href = data.extend.url;
} else {
toastr.warning(data.msg);
}
}
})
}
}
}
}
}
var interval = "";
var qrCodeIdentity = "";
var interval = "";
var qrCodeIdentity = "";
//获取扫码登录二维码
function handoffLogin() {
$.ajax({
type: "POST",
data: {loginTypeBitValue: 16, type: 3, projectUid: "cloudkey-fstth", ApplicationId: "fstth-wzh"},
url: path + '/font/getQRcode',
success: function (data) {
qrCodeIdentity = data.qrCodeIdentity;
$("#QRcordImg").prop("src", "data:image/jpeg;base64," + data.qrCodeBase64);
//轮询监听用户扫码
interval = setInterval(scanCodeLogin, 1000, qrCodeIdentity);
}
function handoffLogin() {
$.ajax({
type: "POST",
data: {loginTypeBitValue: 16, type: 3, projectUid: "cloudkey-fstth", ApplicationId: "fstth-wzh"},
url: path + '/font/getQRcode',
success: function (data) {
qrCodeIdentity = data.qrCodeIdentity;
$("#QRcordImg").prop("src", "data:image/jpeg;base64," + data.qrCodeBase64);
//轮询监听用户扫码
interval = setInterval(scanCodeLogin, 1000, qrCodeIdentity);
}
})
$("#switchHandoff").css("display", "none");
$("#switchHandoff2").css("display", "block");
})
$("#switchHandoff").css("display", "none");
$("#switchHandoff2").css("display", "block");
}
}
function scanCodeLogin() {
$.ajax({
type: "POST",
data: {qrCodeIdentity: qrCodeIdentity},
url: path + '/font/getScanCode',
success: function (body) {
if (body.verifyStatus == 0) {
//扫码认证成功后撤销监听
clearInterval(interval);
$.ajax({
type: "POST",
data: {userToken: body.userToken},
url: path + '/font/getUserInfo',
success: function (tlte) {
if (tlte.msgType == 1) {
$.ajax({
type: "POST",
data: {userName: tlte.uid},
url: path + '/font/qRCodeLogin',
success: function (tltel) {
if (tltel.code == 100) {
window.location.href = tltel.extend.url;
} else {
$("#msg").text(tltel.msg);
}
function scanCodeLogin() {
$.ajax({
type: "POST",
data: {qrCodeIdentity: qrCodeIdentity},
url: path + '/font/getScanCode',
success: function (body) {
if (body.verifyStatus == 0) {
//扫码认证成功后撤销监听
clearInterval(interval);
$.ajax({
type: "POST",
data: {userToken: body.userToken},
url: path + '/font/getUserInfo',
success: function (tlte) {
if (tlte.msgType == 1) {
$.ajax({
type: "POST",
data: {userName: tlte.uid},
url: path + '/font/qRCodeLogin',
success: function (tltel) {
if (tltel.code == 100) {
window.location.href = tltel.extend.url;
} else {
$("#msg").text(tltel.msg);
}
})
} else {
alert("登录失败请重新登录")
}
}
})
} else {
alert("登录失败请重新登录")
}
})
}
}
})
}
})
}
})
}
}
function handoffLogin2() {
function handoffLogin2() {
$("#switchHandoff").css("display", "block");
$("#switchHandoff2").css("display", "none");
clearInterval(interval);
$("#switchHandoff").css("display", "block");
$("#switchHandoff2").css("display", "none");
clearInterval(interval);
}
}
$('body').keydown(function () {
if (event.keyCode == '13') {
login();
}
})
/**
* 判断是iframe框架跳出iframe框架使用top链接
*/
if (top.location != location) {
top.location.href = location.href;
$('body').keydown(function () {
if (event.keyCode == '13') {
login();
}
})
/**
* 判断是iframe框架跳出iframe框架使用top链接
*/
if (top.location != location) {
top.location.href = location.href;
}

@ -504,7 +504,7 @@ function resetPassword(){
if(ids.length == 2){
Common.confirm({
title: "提示",
message: '确定是否重置用户名'+userName[0]+'的密码为000000',
message: '确定是否重置用户名'+userName[0]+'的密码为123456',
operate: function (reselt) {
if (reselt) {
$.ajax({

@ -51,6 +51,12 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

@ -45,6 +45,13 @@ public class Msg {
return result;
}
public static Msg failUser2(){
Msg result=new Msg();
result.setCode(200);
result.setMsg("账号或密码错误次数过多,请十五分钟后在尝试登录");
return result;
}
public static Msg fail(String msg){
Msg result=new Msg();
result.setCode(200);

Loading…
Cancel
Save