package com.doumee.config.shiro; 
 | 
  
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.model.LoginUserInfo; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.dao.business.model.Company; 
 | 
import com.doumee.dao.business.model.CompanyPermission; 
 | 
import com.doumee.dao.system.model.SystemPermission; 
 | 
import com.doumee.dao.system.model.SystemRole; 
 | 
import com.doumee.dao.system.model.SystemUser; 
 | 
import com.doumee.service.business.CompanyPermissionService; 
 | 
import com.doumee.service.business.impl.CompanyServiceImpl; 
 | 
import com.doumee.service.system.SystemDataPermissionService; 
 | 
import com.doumee.service.system.SystemPermissionService; 
 | 
import com.doumee.service.system.SystemRoleService; 
 | 
import com.doumee.service.system.SystemUserService; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.shiro.authc.AuthenticationException; 
 | 
import org.apache.shiro.authc.AuthenticationInfo; 
 | 
import org.apache.shiro.authc.AuthenticationToken; 
 | 
import org.apache.shiro.authc.SimpleAuthenticationInfo; 
 | 
import org.apache.shiro.authz.AuthorizationInfo; 
 | 
import org.apache.shiro.authz.SimpleAuthorizationInfo; 
 | 
import org.apache.shiro.realm.AuthorizingRealm; 
 | 
import org.apache.shiro.subject.PrincipalCollection; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.context.annotation.Lazy; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * 自定义Realm,处理认证和权限 
 | 
 * @author Eva.Caesar Liu 
 | 
 * @date 2022/03/15 09:54 
 | 
 */ 
 | 
@Component 
 | 
public class ShiroRealm extends AuthorizingRealm { 
 | 
  
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private SystemDataPermissionService systemDataPermissionService; 
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private SystemUserService systemUserService; 
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private CompanyPermissionService companyPermissionService; 
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private CompanyServiceImpl companyService; 
 | 
  
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private SystemRoleService systemRoleService; 
 | 
  
 | 
    @Lazy 
 | 
    @Autowired 
 | 
    private SystemPermissionService systemPermissionService; 
 | 
  
 | 
    /** 
 | 
     * 权限处理 
 | 
     * @author Eva.Caesar Liu 
 | 
     * @date 2022/03/15 09:54 
 | 
     */ 
 | 
    @Override 
 | 
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { 
 | 
        LoginUserInfo loginUserInfo = (LoginUserInfo)principalCollection.getPrimaryPrincipal(); 
 | 
        // 设置用户角色和权限 
 | 
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); 
 | 
        authorizationInfo.addRoles(loginUserInfo.getRoles()); 
 | 
        authorizationInfo.addStringPermissions(loginUserInfo.getPermissions()); 
 | 
        return authorizationInfo; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 认证处理 
 | 
     * @author Eva.Caesar Liu 
 | 
     * @date 2022/03/15 09:54 
 | 
     */ 
 | 
    @Override 
 | 
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 
 | 
        // 获取用户名 
 | 
        ShiroToken authenticationToken = (ShiroToken)token; 
 | 
        String username = authenticationToken.getPrincipal().toString(); 
 | 
        // 根据用户名查询用户对象 
 | 
        SystemUser queryDto = new SystemUser(); 
 | 
        if(authenticationToken.isNeedPassword()){ 
 | 
            //账号密码登录 
 | 
            queryDto.setUsername(username); 
 | 
        }else{ 
 | 
            //手机号验证码登录 
 | 
            queryDto.setMobile(username); 
 | 
        } 
 | 
        queryDto.setType(authenticationToken.getUserType()); 
 | 
        queryDto.setDeleted(Boolean.FALSE); 
 | 
        SystemUser user = systemUserService.findOne(queryDto); 
 | 
        if(user == null){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,账号信息不正确!"); 
 | 
        } 
 | 
        if(!Constants.equalsInteger(user.getStatus(),Constants.ZERO)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,账号信息已被禁用,如有疑问请联系系统管理员!"); 
 | 
        } 
 | 
        List<SystemRole> roles = null; 
 | 
        List<SystemPermission> permissions =null; 
 | 
        // 获取登录用户信息 
 | 
         if(authenticationToken.getUserType() == 0){ 
 | 
             roles =   systemRoleService.findByUserId(user.getId()); 
 | 
             permissions =  systemPermissionService.findByUserId(user.getId()); 
 | 
            CompanyPermission c = new CompanyPermission(); 
 | 
            c.setUserId(user.getId()); 
 | 
            c.setIsdeleted(Constants.ZERO); 
 | 
            List<CompanyPermission> pList = companyPermissionService.findList(c); 
 | 
            if(pList!=null){ 
 | 
                for (CompanyPermission cc : pList){ 
 | 
                    if(user.getCompanyIdList() == null){ 
 | 
                        user.setCompanyIdList(new ArrayList<>()); 
 | 
                    } 
 | 
                    user.getCompanyIdList().add(cc.getCompanyId()); 
 | 
                } 
 | 
            } 
 | 
        }else{ 
 | 
            Company company = companyService.findById(user.getCompanyId()); 
 | 
            if(company == null){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,企业账号信息不正确!"); 
 | 
            } 
 | 
            user.setCompany(company); 
 | 
            if(StringUtils.equals(company.getUsername(),user.getUsername())){ 
 | 
                //如果是超管, 
 | 
                SystemRole role = new SystemRole(); 
 | 
                role.setType(Constants.ONE); 
 | 
                role.setDeleted(Boolean.FALSE); 
 | 
                roles =   systemRoleService.findList(role); 
 | 
                SystemPermission p = new SystemPermission(); 
 | 
                permissions =  systemPermissionService.findList(p); 
 | 
            }else{ 
 | 
                roles =   systemRoleService.findByUserId(user.getId()); 
 | 
                permissions =  systemPermissionService.findByUserId(user.getId()); 
 | 
            } 
 | 
        } 
 | 
        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions); 
 | 
        // 验证用户 
 | 
        return new SimpleAuthenticationInfo(userInfo, user.getPassword(), this.getName()); 
 | 
    } 
 | 
  
 | 
} 
 |