LoginServiceImpl.java 4.43 KB
package com.server.shiro.persistent.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.server.shiro.constants.Constants;
import com.server.shiro.persistent.bean.*;
import com.server.shiro.persistent.repository.UserRepository;
import com.server.shiro.persistent.service.LoginService;
import com.server.shiro.util.CommonUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.*;

/**
 * Created by yinbinhome@163.com on 2018/2/23.
 * description:
 */
@Service
public class LoginServiceImpl implements LoginService {
    private Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class);

    @Autowired
    private UserRepository userRepository;
    @PersistenceContext
    private EntityManager entityManager;

    /**
     * 登录表单提交
     *
     * @param jsonObject
     * @return
     */
    @Override
    public JSONObject authLogin(JSONObject jsonObject) {
        String username = jsonObject.getString("username");
        String password = jsonObject.getString("password");
        Subject currentUser = SecurityUtils.getSubject();
        Session session = currentUser.getSession();
        String sessionId = session.getId().toString();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        currentUser.login(token);
        SysUser user= (SysUser) session.getAttribute(Constants.SESSION_USER_INFO);
        UserModel usermodel=getModel(user);
        usermodel.setSessionid(sessionId);

        return CommonUtil.loginJson(usermodel);
    }

    /**
     * 根据用户名和密码查询对应的用户
     *
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @Override
    public SysUser getUser(String username, String password) {
        userRepository.findAll();
        return userRepository.getByUsernameIsAndPasswordIs(username, password);
    }

    /**
     * 查询当前登录用户的权限等信息
     *
     * @return
     */
    @Override
    public SysUser getInfo() {
        //从session获取用户信息
        Session session = SecurityUtils.getSubject().getSession();
        SysUser userInfo = (SysUser) session.getAttribute(Constants.SESSION_USER_INFO);

        return userInfo;
    }

    /**
     * 退出登录
     *
     * @return
     */
    @Override
    public void logout() {
        try {
            Subject currentUser = SecurityUtils.getSubject();
            currentUser.logout();
        } catch (Exception e) {
        }

    }




    //根据SysUser转换前端Model
    public UserModel getModel(SysUser user){
        UserModel model=new UserModel();
        model.setUsername(user.getUsername());
        List<String> rules=new ArrayList<String>();
        List<MenuModel> menus=getMenus(user.getMenus());

        Set<SysRole> roles = (Set<SysRole>) user.getRoles();
        for(SysRole r:roles){
            for(SysRule rule:r.getRules()){
                rules.add(rule.getRuleCode());
            }
        }
        model.setMenus(menus);
        model.setRules(rules);
        return model;
    }


    public List<MenuModel> getMenus(Set<SysMenu> menus){
        List<MenuModel> menu_1=new ArrayList<MenuModel>();
        for(SysMenu menu:menus){
            if(menu.getLevel()==1){
                MenuModel model=new MenuModel();
                model.setWeight(menu.getWeight());
                model.setName(menu.getMenuName());
                List<Map<String,String>> ms=new ArrayList<Map<String,String>>();
                for(SysMenu m:menus){
                    if(m.getParentid()==menu.getId()){
                        Map<String,String> map=new HashMap<String,String>();
                        map.put("menu_name",m.getMenuName());
                        map.put("menu_code",m.getMenuCode());
                        map.put("menu_weight",m.getWeight()+"");
                        map.put("menu_url",m.getMenuUrl());
                        ms.add(map);
                    }
                }
                model.setMenus(ms);
                menu_1.add(model);
            }
        }
        return menu_1;
    }

}