package com.huaxu.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.huaxu.dao.LoginLogMapper; import com.huaxu.dao.UserMapper; import com.huaxu.dto.UserDto; import com.huaxu.entity.LoginLog; import com.huaxu.entity.Org; import com.huaxu.entity.User; import com.huaxu.model.*; import com.huaxu.security.config.RedisTokenStore; import com.huaxu.security.exception.SecurityException; import com.huaxu.security.mobile.MobileLoginAuthenticationToken; import com.huaxu.security.smsCode.SmsCodeException; import com.huaxu.service.UserService; import com.huaxu.util.ByteArrayUtils; import com.huaxu.util.RedisUtil; import com.huaxu.util.UserUtil; import com.huaxu.util.Util; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException; import org.springframework.security.oauth2.provider.*; import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.security.oauth2.provider.token.ConsumerTokenServices; import org.springframework.stereotype.Service; import org.springframework.util.ReflectionUtils; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; /** * 用户(User表)服务实现类 * * @author makejava * @since 2020-10-21 15:23:52 */ @Service("userService") public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private ConsumerTokenServices consumerTokenServices; @Autowired private RedisUtil redisUtil; @Autowired private HttpServletRequest request; @Autowired private ClientDetailsService clientDetailsService; @Autowired private AuthorizationServerTokenServices authorizationServerTokenServices; @Autowired private LoginLogMapper loginLogMapper; /** * 通过ID查询单条数据 * * @param id 主键 * @return 实例对象 */ @Override public User selectById(Integer id) { return this.userMapper.selectById(id); } /** * 查询所有 * * @return 实例对象的集合 */ @Override public List selectAll() { return this.userMapper.selectAll(); } /** * 根据条件查询 * * @return 实例对象的集合 */ @Override public List selectList(User user) { return this.userMapper.selectList(user); } /** * 新增数据 * * @param user 实例对象 * @return 实例对象 */ @Override public int insert(User user) { return this.userMapper.insert(user); } /** * 批量新增 * * @param users 实例对象的集合 * @return 生效的条数 */ @Override public int batchInsert(List users) { return this.userMapper.batchInsert(users); } /** * 修改数据 * * @param user 实例对象 * @return 实例对象 */ @Override public int update(User user) { return this.userMapper.update(user); } /** * 通过主键删除数据 * * @param id 主键 * @return 是否成功 */ @Override public int deleteById(Integer id) { return this.userMapper.deleteById(id); } /** * 查询总数据数 * * @return 数据总数 */ @Override public int count() { return this.userMapper.count(); } /** * 分页查询 * * @return 对象列表 */ @Override public IPage selectPage(User user, IPage page) { return this.userMapper.selectPage(page, user); } @Override public User findUser(User user) { List users = userMapper.selectList(user); if(users!=null&&users.size()>0){ return users.get(0); } return null; } @Override public User chooseUser(User user) { user=findUser(user); UserDto userDto=new UserDto(); userDto.setPhone(user.getPhone()); Set grantedAuthorities = new HashSet<>(); OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) oAuth2Authentication.getPrincipal(); ListprogramItems=new ArrayList<>(); Permission permission= findPermission(user); if(permission==null||(permission!=null&&permission.getRoleState()==0)){ return null; } getDataPermission(permission.getPermissionType(),user,programItems); //角色必须是ROLE_开头,其余的是用户功能权限 /* Integer permissionType = permissionList.get(0).getPermissionType(); List programItemList = newArrayList(); //获取数据权限 //分配功能权限 if (permissionList.size() > 0) { for (Permission permission : permissionList) { if(!StringUtils.equals("",permission.getPermission())){ GrantedAuthority authority1 = new SimpleGrantedAuthority(permission.getPermission()); grantedAuthorities.add(authority1); } } } loginUser.setProgramItemList(programItemList); */ loginUser.setName(user.getUsername()); loginUser.setId(user.getId()); loginUser.setUsername(user.getUsername()); loginUser.setCompanyId(user.getCompanyOrgId()); loginUser.setDepartmentId(user.getDeptOrgId()); loginUser.setTenantId(user.getTenantId()); loginUser.setType(user.getUserType()); loginUser.setPhoneNumber(user.getPhone()); loginUser.setAuthorities(grantedAuthorities); loginUser.setPermissonType(permission.getPermissionType()); loginUser.setRoleId(permission.getRoleId()); MobileLoginAuthenticationToken authenticationTokenReslut = new MobileLoginAuthenticationToken(loginUser,oAuth2Authentication.getCredentials(),loginUser.getAuthorities()); authenticationTokenReslut.setDetails(oAuth2Authentication.getDetails()); OAuth2Authentication oAuth2AuthenticationNew = new OAuth2Authentication(oAuth2Authentication.getOAuth2Request(), authenticationTokenReslut); OAuth2AccessToken accessToken = authorizationServerTokenServices.createAccessToken(oAuth2AuthenticationNew); insertLoginLog(loginUser,"登录"); return user; } private void getDataPermission(int permissionType,User user, List programItemList){ if(permissionType==1){ ProgramItem programItem=new ProgramItem(); programItem.setOrgId(user.getCompanyOrgId()); programItemList.add(programItem); }else if(permissionType==2){ Map> allOrgs = getAllOrgs("company",user.getTenantId()); getOrg(user.getCompanyOrgId(),allOrgs,programItemList); }else if(permissionType==3){ ProgramItem programItem=new ProgramItem(); programItem.setOrgId(user.getDeptOrgId()); programItemList.add(programItem); }else if(permissionType==4) { Map> allOrgs = getAllOrgs("department",user.getTenantId()); getOrg(user.getDeptOrgId(),allOrgs,programItemList); }else if(permissionType==5){ programItemList= userMapper.findOrgRole(user); programItemList.forEach(programItem -> { programItem.setCode(user.getTenantId()); }); } } private Map> getAllOrgs(String orgType,String tenantId){ Org org=new Org(); org.setOrgType(orgType); org.setTenantId(tenantId); List orgs = userMapper.findOrgs(org); Map> collect = orgs.stream(). collect(Collectors.groupingBy(d -> d.getParentOrgId())); return collect; }; public void getOrg(Integer id, Map> collect,ListprogramItemList){ List orgs = collect.get(id); if(orgs!=null){ orgs.forEach(org->{ ProgramItem item=new ProgramItem(); item.setOrgId(org.getId()); item.setCode(org.getTenantId()); programItemList.add(item); getOrg(org.getId(),collect,programItemList); }); } } private Permission findPermission(User user){ List permissionList = userMapper.findPermission(user); if(permissionList.size()==0){ return null; } return permissionList.get(0); } @Override public boolean logOut(String token) { boolean flag=consumerTokenServices.revokeToken(token); insertLoginLog(UserUtil.getCurrentUser(),"登出"); return flag; } private void insertLoginLog(LoginUser loginUser,String type){ LoginLog loginLog=new LoginLog(); loginLog.setName(loginUser.getName()); loginLog.setPhone(loginUser.getPhoneNumber()); loginLog.setCompanyId(loginUser.getCompanyId()); loginLog.setDepartmentId(loginUser.getDepartmentId()); loginLog.setType(type); loginLog.setCreateTime(new Date()); loginLog.setLoginIp(Util.getIpAddr(request)); loginLogMapper.insert(loginLog); } /** * 新增注册数据 * @author yjy * @param user 实例对象 * @return 影响行数 */ @Override public int insertRegister(User user) { return this.userMapper.insertRegister(user); } }