czt
2026-02-05 f8a1a873410f00beb3e2f3f888cabfd9264b207f
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.fzzy.sys.controller;
 
import com.fzzy.sys.LoginCheckManager;
import com.fzzy.sys.service.LoginService;
import com.ruoyi.common.config.FrameworkConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.token.PhoneToken;
import com.ruoyi.framework.web.service.ConfigService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 登录验证
 *
 * @author ruoyi
 */
@Slf4j
@Controller
public class SysLoginController extends BaseController {
    /**
     * 是否开启记住我功能
     */
    @Value("${shiro.rememberMe.enabled: false}")
    private boolean rememberMe;
    @Resource
    private ConfigService configService;
    @Resource
    private ISysUserService userService;
    @Resource
    private LoginService loginService;
    @Resource
    private RedisCache redisCache;
 
    @Resource
    private LoginCheckManager loginCheckManager;
 
    @GetMapping("/login")
    public String login(HttpServletRequest request, HttpServletResponse response, ModelMap mmap) {
        // 如果是Ajax请求,返回Json字符串。
        if (ServletUtils.isAjaxRequest(request)) {
            return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}");
        }
        // 是否开启记住我
        mmap.put("isRemembered", rememberMe);
        // 是否开启用户注册
        String companyId = FrameworkConfig.getCompanyId();
        mmap.put("isAllowRegister", Convert.toBool(configService.getKey("sys.account.registerUser", companyId), false));
        mmap.put("isAllowRegister", true);
        return "login";
    }
 
    /**
     * 登录方法 ---系统自带
     *
     * @param username 用户名
     * @param password 密码
     * @param rememberMe 记住我
     * @return 结果
 
     @PostMapping("/login")
     @ResponseBody
     public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) {
     UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
     Subject subject = SecurityUtils.getSubject();
 
     try {
     subject.login(token);
     return success();
     } catch (AuthenticationException e) {
     log.error("登录异常", e);
     String msg = "用户名或者密码错误,请核对";
     return error(msg);
     }
     }
     */
    /**
     * 登录方法 ---自定义调整
     *
     * @param username 用户名
     * @param password 密码
     * @param rememberMe 记住我
     * @return 结果
     */
    @PostMapping("/login")
    @ResponseBody
    public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe) {
 
        UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
            //清除错误信息
            loginCheckManager.clearCheckError(username);
            return success();
        } catch (AuthenticationException e) {
 
            //根据自定义换缓存判断信息
            String errorMsg = loginCheckManager.getCheckError(username);
            if(StringUtils.isNotBlank(errorMsg)){
                //loginCheckManager.clearCheckError(username);
                return error(errorMsg);
            }
 
            log.error("用户[" + username + "]登录异常,{}", e.getMessage());
            String msg = "登录异常,信息:"+e.getMessage();
            return error(msg);
        }
    }
 
    //获取验证码
    @GetMapping("/login/sendMessageCode")
    @ResponseBody
    public AjaxResult sendMessageCode(@RequestParam("phoneNumber") String phoneNumber) {
        if (StringUtils.isEmpty(phoneNumber)) {
            return error("手机号不能为空");
        }
        //判断手机号是否注册
        SysUser sysUser = userService.selectUserByPhoneNumber(phoneNumber);
        if (sysUser == null) {
            return error("手机号未注册");
        }
        //获取验证码
        loginService.getCode(phoneNumber);
        return success();
    }
 
    @PostMapping("/messageLogin")
    @ResponseBody
    public AjaxResult messageLogin(String phoneNumber, String validateCode) {
        PhoneToken token = new PhoneToken(phoneNumber, validateCode, false, null);
        Subject subject = SecurityUtils.getSubject();
        SysUser sysUser = userService.selectUserByPhoneNumber(phoneNumber);
        if (sysUser == null) {
            return error("手机号未注册");
        }
 
        String redisCode = redisCache.getCacheObject("smsCode_" + phoneNumber);
        if (!validateCode.equals(redisCode)) {
            return error("验证码不正确");
        }
 
        try {
            subject.login(token);
            return success();
        } catch (AuthenticationException e) {
            String msg = "手机号或验证码错误";
            if (StringUtils.isNotEmpty(e.getMessage())) {
                msg = e.getMessage();
            }
            return error(msg);
        }
 
    }
 
 
    @GetMapping("/unauth")
    public String unauth() {
        return "error/unauth";
    }
}