|
@@ -0,0 +1,214 @@
|
|
|
+package com.bz.smart_city.commom.security.platform;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.bz.smart_city.commom.security.validate.ValidateCodeException;
|
|
|
+import com.bz.smart_city.commom.util.ByteArrayUtils;
|
|
|
+import com.bz.smart_city.commom.util.RedisUtil;
|
|
|
+import com.bz.smart_city.dao.*;
|
|
|
+import com.bz.smart_city.dto.LoginUser;
|
|
|
+import com.bz.smart_city.dto.SiteUserDto;
|
|
|
+import com.bz.smart_city.entity.*;
|
|
|
+import com.bz.smart_city.service.PermissionService;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.http.HttpEntity;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.security.authentication.DisabledException;
|
|
|
+import org.springframework.security.core.userdetails.UserDetails;
|
|
|
+import org.springframework.security.core.userdetails.UserDetailsService;
|
|
|
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.UUID;
|
|
|
+
|
|
|
+import static com.google.common.collect.Lists.newArrayList;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class PlatformLoginUserDetailService implements UserDetailsService {
|
|
|
+ @Resource
|
|
|
+ private UserMapper userMapper;
|
|
|
+ @Resource
|
|
|
+ private PermissionService permissionService;
|
|
|
+ @Resource
|
|
|
+ private SiteUserMapper siteUserMapper;
|
|
|
+ @Resource
|
|
|
+ private SiteMapper siteMapper;
|
|
|
+ @Resource
|
|
|
+ private ProgramMapper programMapper;
|
|
|
+ @Resource
|
|
|
+ private ProgramItemMapper programItemMapper;
|
|
|
+ @Resource
|
|
|
+ private CustomerMapper customerMapper;
|
|
|
+ @Autowired
|
|
|
+ private RedisUtil redisUtil;
|
|
|
+
|
|
|
+ @Value("${platform_appid}")
|
|
|
+ private String appId;
|
|
|
+
|
|
|
+ @Value("${platform_appSecret}")
|
|
|
+ private String appSecret;
|
|
|
+ @Value("${platform_url}")
|
|
|
+ private String url;
|
|
|
+
|
|
|
+ private String sendApiReQuest(String path , Map<String, Object> map){
|
|
|
+
|
|
|
+ RestTemplate restTemplate=new RestTemplate();
|
|
|
+ ResponseEntity<String> res = restTemplate.getForEntity(path,String.class,map);
|
|
|
+ String body = res.getBody();
|
|
|
+ JSONObject info = JSONObject.parseObject(body);
|
|
|
+ String result=null;
|
|
|
+ if(info.getInteger("status")==0){
|
|
|
+ result=info.getString("data");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public UserDetails loadUserByUsername(String code) throws UsernameNotFoundException {
|
|
|
+ JSONObject jsonObject=new JSONObject();
|
|
|
+ jsonObject.put("appId",appId);
|
|
|
+ jsonObject.put("appSecret",appSecret);
|
|
|
+ jsonObject.put("code",code);
|
|
|
+ String uniqId = sendApiReQuest(url, jsonObject);
|
|
|
+
|
|
|
+ User user =userMapper.findUserByUniqId(uniqId);
|
|
|
+
|
|
|
+ if (user == null) {
|
|
|
+ String key= UUID.randomUUID().toString();
|
|
|
+ if(uniqId!=null)
|
|
|
+ redisUtil.set(key,uniqId);
|
|
|
+ redisUtil.setExpire(key,1800);
|
|
|
+ throw new PlatformException(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断是否禁用
|
|
|
+ if (user.getStatus() == 2) {
|
|
|
+ throw new DisabledException("账号已被禁用");
|
|
|
+ }
|
|
|
+ LoginUser loginUser = new LoginUser();
|
|
|
+ BeanUtils.copyProperties(user, loginUser);
|
|
|
+
|
|
|
+ Map<Integer, List<Permission>> permissionMap = new HashMap<>();
|
|
|
+ Map<Integer, List<ProgramItem>> datePermissionMap = new HashMap<>();
|
|
|
+ if (user.getIsSuperAdmin() == 1) {
|
|
|
+ //超级管理员的权限
|
|
|
+ List<Permission> permissions = permissionService.getPermissionBySuperAdmin();
|
|
|
+ permissionMap.put(0, permissions);
|
|
|
+ loginUser.setCurrentSiteId(0);
|
|
|
+ loginUser.setType(1);
|
|
|
+ } else {
|
|
|
+ //站点管理员(多站点)
|
|
|
+ Integer siteId = null;
|
|
|
+ List<Site> siteList = siteUserMapper.getSiteByUserId(user.getId());
|
|
|
+ List<SiteUserDto> siteV2List = siteUserMapper.getSiteByUserIdV2(user.getId());
|
|
|
+ if (siteList == null || siteList.size() == 0) {
|
|
|
+ throw new ValidateCodeException("该用户未关联站点");
|
|
|
+ }
|
|
|
+
|
|
|
+ siteV2List.forEach(site -> {
|
|
|
+ if(site.getUserType() == 2){
|
|
|
+ List<Permission> permissions = permissionService.getPermissionBySiteAdminV2(site.getId(),site.getType());;
|
|
|
+ permissionMap.put(site.getId(), permissions);
|
|
|
+ }else {
|
|
|
+ permissionMap.put(site.getId(), permissionService.getPermissionByUserId(user.getId(), site.getId()));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<ProgramItem> programItemList = programItemMapper.getBySiteIdAndUserId(site.getId(), user.getId());
|
|
|
+ if (programItemList != null && programItemList.size() > 0) {
|
|
|
+ datePermissionMap.put(site.getId(), programItemList);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ permissionMap.put(0, newArrayList());
|
|
|
+
|
|
|
+
|
|
|
+ String key = "useSelectSiteId:" + user.getId();
|
|
|
+ byte[] useSelectSiteIdByte = redisUtil.get(key.getBytes());
|
|
|
+ if (useSelectSiteIdByte != null) {
|
|
|
+ Integer useSelectSiteId = (Integer) ByteArrayUtils.bytesToObject(useSelectSiteIdByte).get();
|
|
|
+ if (!checkSite(siteList, useSelectSiteId)) {
|
|
|
+ siteId = siteList.size()>0?siteList.get(0).getId():0;
|
|
|
+ //保存redis
|
|
|
+ redisUtil.setExpire(key.getBytes(), ByteArrayUtils.objectToBytes(siteId).get());
|
|
|
+ }else {
|
|
|
+ siteId = useSelectSiteId;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ siteId = siteList.size()>0?siteList.get(0).getId():0;
|
|
|
+ //保存redis
|
|
|
+ redisUtil.setExpire(key.getBytes(), ByteArrayUtils.objectToBytes(siteId).get());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ SiteUser siteUser = siteUserMapper.findBySiteIdAndUserId(siteId,user.getId());
|
|
|
+
|
|
|
+ loginUser.setType(siteUser.getType());
|
|
|
+ loginUser.setOrgId(siteUser.getOrganId());
|
|
|
+ loginUser.setSiteId(siteId);
|
|
|
+ loginUser.setCurrentSiteId(siteId);
|
|
|
+ loginUser.setSiteList(siteList);
|
|
|
+ loginUser.setIsSiteAdmin(siteUser.getIsAdmin());//站点管理员
|
|
|
+ loginUser.setSiteType(checkSiteType(siteList,siteId));
|
|
|
+
|
|
|
+ Site site = siteMapper.findById(siteId);
|
|
|
+ loginUser.setCustomerId(site.getCustomerId());
|
|
|
+ loginUser.setCustomerName(site.getCustomerName());
|
|
|
+ loginUser.setOrgId(siteUser.getOrganId());
|
|
|
+
|
|
|
+ //查询数据权限
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /*else {
|
|
|
+ //查询平台用户的站点
|
|
|
+ Site site = siteUserMapper.findSiteByUserId(user.getId());
|
|
|
+ if (site != null) {
|
|
|
+ List<Site> siteList = newArrayList();
|
|
|
+ siteList.add(site);
|
|
|
+ loginUser.setSiteId(site.getId());
|
|
|
+ loginUser.setCurrentSiteId(site.getId());
|
|
|
+ loginUser.setSiteList(siteList);
|
|
|
+
|
|
|
+ //查询功能权限
|
|
|
+ permissionMap.put(site.getId(), permissionService.getPermissionByUserId(user.getId(), null));
|
|
|
+ //查询数据权限
|
|
|
+ datePermissionMap.put(site.getId(), programItemMapper.getBySiteIdAndUserId(site.getId(), user.getId()));
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+
|
|
|
+
|
|
|
+ /*Customer customer = null;
|
|
|
+ if(loginUser.getOrgId()!=null) {
|
|
|
+ customer = customerMapper.findByOrgId(loginUser.getOrgId());
|
|
|
+ //loginUser.setOrgId(user.getOrganId());
|
|
|
+ }
|
|
|
+ if(customer!=null)
|
|
|
+ loginUser.setCustomerId(customer.getId());*/
|
|
|
+ loginUser.setPermissionMap(permissionMap);
|
|
|
+ loginUser.setDataPermissionMap(datePermissionMap);
|
|
|
+ return loginUser;
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断siteList中是否包含siteId
|
|
|
+ private boolean checkSite(List<Site> siteList, Integer siteId) {
|
|
|
+ return siteList.parallelStream().anyMatch(site -> site.getId().equals(siteId));
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer checkSiteType(List<Site> siteList, Integer siteId) {
|
|
|
+ Integer siteType = null;
|
|
|
+ for (Site site : siteList) {
|
|
|
+ if(site.getId().equals(siteId)){
|
|
|
+ siteType = site.getType();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return siteType;
|
|
|
+ }
|
|
|
+}
|