|
@@ -1,15 +1,30 @@
|
|
|
package com.sooka.module.web.system.service.impl;
|
|
|
|
|
|
+import com.google.common.collect.Maps;
|
|
|
+import com.sooka.common.constant.CmsConst;
|
|
|
import com.sooka.common.utils.CheckSumUtil;
|
|
|
+import com.sooka.common.utils.ControllerUtil;
|
|
|
import com.sooka.common.utils.JsonUtil;
|
|
|
import com.sooka.common.utils.StrUtil;
|
|
|
import com.sooka.component.shiro.PasswordKit;
|
|
|
import com.sooka.module.web.system.service.CmsUserService;
|
|
|
+import com.sooka.module.web.system.vo.UserVo;
|
|
|
import com.sooka.mybatis.mapper.TCmsUserMapper;
|
|
|
import com.sooka.mybatis.model.TCmsUser;
|
|
|
+import org.apache.commons.beanutils.BeanUtils;
|
|
|
+import org.apache.shiro.SecurityUtils;
|
|
|
+import org.apache.shiro.authc.*;
|
|
|
+import org.apache.shiro.subject.Subject;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.cache.Cache;
|
|
|
+import org.springframework.cache.ehcache.EhCacheCacheManager;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpSession;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
/**
|
|
|
* Description:前台用户控制器
|
|
|
*
|
|
@@ -21,6 +36,76 @@ public class CmsUserServiceImpl implements CmsUserService {
|
|
|
@Autowired
|
|
|
private TCmsUserMapper userMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private EhCacheCacheManager springEhCacheManager;
|
|
|
+
|
|
|
+ private void putInCache(Cache cache, String username) {
|
|
|
+ Integer tryCount = getTryCount(cache, username);
|
|
|
+ cache.put(username, tryCount += 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer getTryCount(Cache cache, String username) {
|
|
|
+ Cache.ValueWrapper valueWrapper = cache.get(username);
|
|
|
+ Integer tryCount = 0;
|
|
|
+ if (valueWrapper != null) {
|
|
|
+ tryCount = (Integer) valueWrapper.get();
|
|
|
+ }
|
|
|
+ return tryCount;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> login(HttpServletRequest request) {
|
|
|
+ String username = request.getParameter("username"), password = request.getParameter("password"),
|
|
|
+ remberMe = request.getParameter("remberMe");
|
|
|
+ Map<String, Object> result = Maps.newHashMap();
|
|
|
+ result.put("success", false);
|
|
|
+ Cache cache = springEhCacheManager.getCache("cms-login-cache");
|
|
|
+ Integer tryCount = getTryCount(cache, username);
|
|
|
+ if (tryCount >= 5) {
|
|
|
+ result.put("message", "密码输入错误次数超限,请5分钟后再试");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ HttpSession session = request.getSession();
|
|
|
+ Subject currentUser = SecurityUtils.getSubject();
|
|
|
+ UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
|
|
|
+ /*是否需要记住我*/
|
|
|
+ if ("true".equals(remberMe)) {
|
|
|
+ usernamePasswordToken.setRememberMe(true);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ currentUser.login(usernamePasswordToken);
|
|
|
+ TCmsUser user = selectByUsername(username);
|
|
|
+ user.setLoginTime(new Date());
|
|
|
+ user.setLastIp(ControllerUtil.getRemoteAddress(request));
|
|
|
+ /*更新用户的登陆信息*/
|
|
|
+ userMapper.updateByPrimaryKey(user);
|
|
|
+ /*userVo和TSysUser没什么区别,只是增加了siteId*/
|
|
|
+ UserVo userVo = new UserVo();
|
|
|
+ BeanUtils.copyProperties(userVo, user);
|
|
|
+ /*设置session*/
|
|
|
+ session.setAttribute(CmsConst.SITE_USER_SESSION_KEY, userVo);
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("message", "登录成功!");
|
|
|
+ } catch (UnknownAccountException e) {
|
|
|
+ result.put("message", "账号输入错误!");
|
|
|
+ } catch (IncorrectCredentialsException e) {
|
|
|
+ result.put("message", "密码输入错误!");
|
|
|
+ putInCache(cache, username);
|
|
|
+ } catch (LockedAccountException e) {
|
|
|
+ result.put("message", "当前账号已被停用!");
|
|
|
+ } catch (AuthenticationException ae) {
|
|
|
+ result.put("message", "账号或者密码输入错误!");
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("message", "发生了一个错误!");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TCmsUser selectByUsername(String username) {
|
|
|
+ return userMapper.selectByUsername(username);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public String insert(TCmsUser user) {
|
|
|
/* 加工password */
|