mitao
2024-07-08 022a7ff7abf82cd2546e18071ade5228b4e2339f
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
package com.sinata.modular.system.controller;
 
import com.google.code.kaptcha.Constants;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.exception.InvalidKaptchaException;
import com.sinata.core.log.LogManager;
import com.sinata.core.log.factory.LogTaskFactory;
import com.sinata.core.node.MenuNode;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.ApiMenuFilter;
import com.sinata.core.util.KaptchaUtil;
import com.sinata.core.util.ToolUtil;
import com.sinata.modular.system.controller.util.AccountCheckUtil;
import com.sinata.modular.system.model.User;
import com.sinata.modular.system.service.IMenuService;
import com.sinata.modular.system.service.IUserService;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
import java.util.List;
 
import static com.sinata.core.support.HttpKit.getIp;
 
/**
 * 登录控制器
 *
 * @author fengshuonan
 * @Date 2017年1月10日 下午8:25:24
 */
@Controller
public class LoginController extends BaseController {
 
    @Value("${spring.profiles.active}")
    private String profiles;
 
    @Autowired
    private AccountCheckUtil accountCheckUtil;
 
    @Autowired
    private IMenuService menuService;
 
    @Autowired
    private IUserService userService;
 
    /**
     * 跳转到主页
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
        //获取菜单列表
        List<Integer> roleList = ShiroKit.getUser().getRoleList();
        if (roleList == null || roleList.size() == 0) {
            ShiroKit.getSubject().logout();
            model.addAttribute("tips", "该用户没有角色,无法登陆");
            return "/login.html";
        }
        List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
        List<MenuNode> titles = MenuNode.buildTitle(menus);
        titles = ApiMenuFilter.build(titles);
 
        model.addAttribute("titles", titles);
 
        //获取用户头像
        Integer id = ShiroKit.getUser().getId();
        User user = userService.selectById(id);
        String avatar = user.getAvatar();
        model.addAttribute("avatar", avatar);
        model.addAttribute("profiles", profiles);
        return "/index.html";
    }
 
    /**
     * 跳转到登录页面
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) {
            return REDIRECT + "/";
        } else {
            return "/login.html";
        }
    }
 
    /**
     * 点击登录执行的动作
     */
    @BussinessLog(value = "登录系统")
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String loginVali() {
        String username = super.getPara("username").trim();
        String password = super.getPara("password").trim();
        String remember = super.getPara("remember");
 
        //验证验证码是否正确
        if (KaptchaUtil.getKaptchaOnOff()) {
            String kaptcha = super.getPara("kaptcha").trim();
            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
                // 账号验证码-验证次数
                accountCheckUtil.accountCheckCodeNum(username, false);
                throw new InvalidKaptchaException();
            } else {
                // 账号验证码次数
                accountCheckUtil.accountCheckCodeNum(username, true);
            }
        }
 
        // 账号密码-验证次数
        accountCheckUtil.accountCheckPwdNum(username, password);
 
        Subject currentUser = ShiroKit.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
 
        if ("on".equals(remember)) {
            token.setRememberMe(true);
        } else {
            token.setRememberMe(false);
        }
 
        currentUser.login(token);
 
        ShiroUser shiroUser = ShiroKit.getUser();
        super.getSession().setAttribute("shiroUser", shiroUser);
        super.getSession().setAttribute("username", shiroUser.getAccount());
 
        LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));
 
        ShiroKit.getSession().setAttribute("sessionFlag", true);
 
        return REDIRECT + "/";
    }
 
    /**
     * 退出登录
     */
    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    public String logOut() {
        LogManager.me().executeLog(LogTaskFactory.exitLog(ShiroKit.getUser().getId(), getIp()));
        ShiroKit.getSubject().logout();
        deleteAllCookie();
        return REDIRECT + "/login";
    }
}