Pu Zhibing
2 天以前 11d649e0de6490c53efe6df0ee10212ee6088d14
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -1,7 +1,10 @@
package com.stylefeng.guns.modular.system.controller.system;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.google.code.kaptcha.Constants;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.beetl.ShiroExtUtil;
import com.stylefeng.guns.core.common.constant.Const;
import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
import com.stylefeng.guns.core.log.LogManager;
@@ -15,11 +18,19 @@
import com.stylefeng.guns.core.util.KaptchaUtil;
import com.stylefeng.guns.core.util.SinataUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.UserMapper;
import com.stylefeng.guns.modular.system.model.Menu;
import com.stylefeng.guns.modular.system.model.Relation;
import com.stylefeng.guns.modular.system.model.User;
import com.stylefeng.guns.modular.system.service.IMenuService;
import com.stylefeng.guns.modular.system.service.IRelationService;
import com.stylefeng.guns.modular.system.service.IUserService;
import com.stylefeng.guns.modular.system.util.AESUtil;
import com.stylefeng.guns.modular.system.util.AESUtils;
import com.stylefeng.guns.modular.system.util.RedisUtil;
import com.stylefeng.guns.modular.system.warpper.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
@@ -32,7 +43,11 @@
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.stylefeng.guns.core.support.HttpKit.getIp;
@@ -42,6 +57,7 @@
 * @author fengshuonan
 * @Date 2017年1月10日 下午8:25:24
 */
@Slf4j
@Controller
public class LoginController extends BaseController {
@@ -53,7 +69,19 @@
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private IShiro shiro;
    @Autowired
    private UserMapper userMapper;
    private Map<String, Integer> loginFailures = new HashMap<>();
    @Autowired
    private IRelationService relationService;
    @Autowired
    private ShiroExtUtil shiroExtUtil;
@@ -61,33 +89,35 @@
    /**
     * 跳转到主页
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String index(Model model, HttpServletRequest request) throws UnsupportedEncodingException {
        //session中解析用户数据
        HttpSession session = request.getSession();
        String onconParam = edu.yale.its.tp.cas.client.Util.getOnconParam(session);
        onconParam = new String(Base64.decodeBase64(onconParam), "UTF-8");
        LoginUser loginUser = JSON.parseObject(onconParam, LoginUser.class);
        log.info("session解析结果:" + JSON.toJSONString(loginUser));
        //获取菜单列表
        List<Integer> roleList = ShiroKit.getUser().getRoleList();
        if (roleList == null || roleList.size() == 0) {
            ShiroKit.getSubject().logout();
            model.addAttribute("tips", "该用户没有角色,无法登陆");
            return "/login.html";
        User user = userMapper.getByAccount(loginUser.getImUser());
        if (null == user) {
            log.info("用户不存在");
            return null;
        }
        ShiroUser shiroUser = shiro.shiroUser(user);
        List<Integer> roleList = shiroUser.getRoleList();
        if (roleList == null || roleList.size() == 0) {
            roleList.add(0);
        }
        List<Relation> relations = relationService.selectList(new EntityWrapper<Relation>().in("roleid", roleList));
        Set<Long> collect = relations.stream().map(Relation::getMenuid).collect(Collectors.toSet());
        List<Menu> menuList = menuService.selectBatchIds(collect);
        List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
        List<MenuNode> titles = MenuNode.buildTitle(menus);
        titles = ApiMenuFilter.build(titles);
        Integer id = ShiroKit.getUser().getId();
        User user = userService.selectById(id);
        if (SinataUtil.isEmpty(user)){
            ShiroKit.getSubject().logout();
            model.addAttribute("tips", "请重新登录");
            return "/login.html";
        }
        //设置上级ID
        if (SinataUtil.isNotEmpty(user.getObjectId())){
            ShiroKit.getUser().setObjectId(user.getObjectId());
        }
        //设置角色
        ShiroKit.getUser().setRoleType(user.getRoleType());
        shiroUser.setMenuIds(menuList.stream().map(Menu::getUrl).collect(Collectors.toList()));
        shiroUser.setRoleType(user.getRoleType());
        shiroUser.setObjectId(user.getObjectId());
        model.addAttribute("titles", titles);
@@ -100,27 +130,29 @@
                null == user.getPassWordUpdate()
                        || user.getPassWordUpdate().getTime() + 7776000000L <= System.currentTimeMillis()
                        ? "您的密码已经90天未更换了,请及时更换密码!!!" : "");
        redisUtil.setStrValue(loginUser.getOnconUUID(), JSON.toJSONString(shiroUser), 36000);
        return "/index.html";
    }
    /**
     * 跳转到登录页面
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(Model model) {
        model.addAttribute("number",0);
        if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) {
            return REDIRECT + "/";
        } else {
            return "/login.html";
        }
    }
//    /**
//     * 跳转到登录页面
//     */
//    @RequestMapping(value = "/login", method = RequestMethod.GET)
//    public String login(Model model) {
//        model.addAttribute("number",0);
//        if (shiroExtUtil.authenticated() || shiroExtUtil.getUser() != null) {
//            return REDIRECT + "/";
//        } else {
//            return "/login.html";
//        }
//    }
    /**
     * 点击登录执行的动作
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String loginVali(String username, String password,String sms_code, String remember, Model model, HttpServletRequest request) {
        password = AESUtil.decrypt(password);
        Integer f = loginFailures.get(username);
        f = f == null ? 0 : f;
        // 校验账号,密码是否正确,如果错误,对次数进行加1
@@ -181,7 +213,7 @@
        // 登录成功,错误次数值改0
        loginFailures.put(username, 0);
        ShiroUser shiroUser = ShiroKit.getUser();
        ShiroUser shiroUser = shiroExtUtil.getUser();
        super.getSession().setAttribute("shiroUser", shiroUser);
        super.getSession().setAttribute("username", shiroUser.getAccount());
@@ -196,9 +228,6 @@
     */
    @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";
        return REDIRECT + "/";
    }
}