Procházet zdrojové kódy

Merge branch 'hot-fix-loginByMobile' into 'Release'

fix手机验证码登录逻辑

修复:
1. 手机+验证码登录不记录IP
2. 手机+验证码登录不显示老师账号过期时间

See merge request !357

huangyong před 8 roky
rodič
revize
ab252f6198

+ 40 - 24
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/UserController.java

@@ -3,9 +3,12 @@ package cn.iselab.mooctest.site.web.ctrl;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.configure.realm.DefaultUsernamepasswordToken;
 import cn.iselab.mooctest.site.dao.MobileVerificationDao;
+import cn.iselab.mooctest.site.models.ManagerProperty;
 import cn.iselab.mooctest.site.models.MobileVerification;
 import cn.iselab.mooctest.site.models.User;
+import cn.iselab.mooctest.site.service.ManagerPropertyService;
 import cn.iselab.mooctest.site.service.OpenId2UserIdService;
+import cn.iselab.mooctest.site.service.RecordService;
 import cn.iselab.mooctest.site.service.UserService;
 import cn.iselab.mooctest.site.web.data.ManagerPropertyVO;
 import cn.iselab.mooctest.site.web.data.UserVO;
@@ -56,6 +59,12 @@ public class UserController {
     @Autowired
     private OpenId2UserIdService openId2UserIdService;
 
+    @Autowired
+    private ManagerPropertyService managerPropertyService;
+
+    @Autowired
+    private RecordService recordService;
+
     private Logger LOG = LoggerFactory.getLogger(getClass());
 
     @RequiresPermissions("personInfo:update")
@@ -107,7 +116,7 @@ public class UserController {
     }
 
     @RequestMapping(value = "/api/mobileLogin", method = RequestMethod.POST)
-    public UserVO loginByMobile(@RequestBody UserVO userVO, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
+    public UserVO loginByMobile(@RequestBody UserVO userVO, BindingResult bindingResult, RedirectAttributes redirectAttributes,HttpServletRequest request) {
         if (bindingResult.hasErrors()) {
             throw new HttpUnauthorizedException("unauthorized");
 
@@ -122,38 +131,45 @@ public class UserController {
         //获取当前的Subject
         Subject currentUser = SecurityUtils.getSubject();
         LOG.info("session过期时间 +" + SecurityUtils.getSubject().getSession().getTimeout());
-        try {
-            //在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查
-            //每个Realm都能在必要时对提交的AuthenticationTokens作出反应
-            //所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法
-            currentUser.login(token);
-        } catch (UnknownAccountException uae) {
-            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,未知账户");
-            redirectAttributes.addFlashAttribute("message", "未知账户");
-        } catch (IncorrectCredentialsException ice) {
-            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证");
-            redirectAttributes.addFlashAttribute("message", "密码不正确");
-        } catch (LockedAccountException lae) {
-            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定");
-            redirectAttributes.addFlashAttribute("message", "账户已锁定");
-        } catch (ExcessiveAttemptsException eae) {
-            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多");
-            redirectAttributes.addFlashAttribute("message", "用户名或密码错误次数过多");
-        } catch (AuthenticationException ae) {
-            //通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
-            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下");
-            ae.printStackTrace();
-            redirectAttributes.addFlashAttribute("message", "用户名或密码不正确");
-        }
+        currentUser.login(token);
+//        try {
+//            //在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查
+//            //每个Realm都能在必要时对提交的AuthenticationTokens作出反应
+//            //所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法
+//            currentUser.login(token);
+//        } catch (UnknownAccountException uae) {
+//            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,未知账户");
+//            redirectAttributes.addFlashAttribute("message", "未知账户");
+//        } catch (IncorrectCredentialsException ice) {
+//            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证");
+//            redirectAttributes.addFlashAttribute("message", "密码不正确");
+//        } catch (LockedAccountException lae) {
+//            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定");
+//            redirectAttributes.addFlashAttribute("message", "账户已锁定");
+//        } catch (ExcessiveAttemptsException eae) {
+//            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多");
+//            redirectAttributes.addFlashAttribute("message", "用户名或密码错误次数过多");
+//        } catch (AuthenticationException ae) {
+//            //通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
+//            System.out.println("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下");
+//            ae.printStackTrace();
+//            redirectAttributes.addFlashAttribute("message", "用户名或密码不正确");
+//        }
         //验证是否登录成功
         if (currentUser.isAuthenticated()) {
             System.out.println("用户[" + username + "]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)");
+            recordService.recordLoginAction(request,userVO.getId());
             User user = userService.findByMobile(userVO.getMobile());
             userVO = userVOWrapper.wrap(user);
             userVO.setPassword("");
             userVO.setMenuVOs(menuLogic.getMenuListByUserId(user.getId()));
             userVO.setOpenId(openId2UserIdService.findOpenIdByUserId(userVO.getId()));
             currentUser.getSession().setAttribute("User", user);
+
+            if (managerPropertyService.getManagerPropertyByUserId(user.getId()) != null){
+                ManagerProperty managerProperty = managerPropertyService.getManagerPropertyByUserId(user.getId());
+                userVO.setExpireTime(Long.valueOf(managerProperty.getExpireTime().getTime()));
+            }
             return userVO;
         } else {
             token.clear();