jiangping
2023-12-06 09b8e33a1b2a1f3759b08ae1e37da9769a1aaabf
海康接口对接开发
已添加3个文件
已修改10个文件
282 ■■■■ 文件已修改
.idea/libraries/Maven__commons_net_commons_net_3_8_0.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCache.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroToken.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/libraries/Maven__commons_net_commons_net_3_8_0.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<component name="libraryTable">
  <library name="Maven: commons-net:commons-net:3.8.0">
    <CLASSES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-net/commons-net/3.8.0/commons-net-3.8.0.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$MAVEN_REPOSITORY$/commons-net/commons-net/3.8.0/commons-net-3.8.0-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$MAVEN_REPOSITORY$/commons-net/commons-net/3.8.0/commons-net-3.8.0-sources.jar!/" />
    </SOURCES>
  </library>
</component>
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java
@@ -12,6 +12,8 @@
import com.doumee.dao.business.model.Device;
import com.doumee.service.business.DeviceService;
import com.doumee.service.business.HkSyncService;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -32,22 +34,24 @@
public class HkSyncController extends BaseController {
    @Autowired
    private HkSyncService hkSyncService;
    private HkSyncDeviceServiceImpl hkSyncDeviceService;
    @Autowired
    private HkSyncParkServiceImpl hkSyncParkService;
    @PreventRepeat
    @ApiOperation("【海康】全量同步门禁设备接口")
    @PostMapping("/getDevices")
    @RequiresPermissions("business:hksync:device")
//    @RequiresPermissions("business:hksync:device")
    public ApiResponse getDevices(@RequestBody AcsDeviceListRequest param) {
        String result = hkSyncService.syncHkDevices(param);
        String result = hkSyncDeviceService.syncHkDevices(param);
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】全量同步停车库接口")
    @PostMapping("/getDevices")
    @RequiresPermissions("business:hksync:park")
    public ApiResponse getDevices(@RequestBody ParkListRequest param) {
        String result = hkSyncService.syncHkParks(param);
    @PostMapping("/getParks")
//    @RequiresPermissions("business:hksync:park")
    public ApiResponse getParks(@RequestBody ParkListRequest param) {
        String result = hkSyncParkService.syncHkParks(param);
        return ApiResponse.success(result);
    }
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
@@ -12,7 +12,7 @@
/**
 * Shiro认证过滤器,处理未认证情况的响应
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
public class ShiroAuthFilter extends FormAuthenticationFilter {
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCache.java
@@ -1,24 +1,28 @@
package com.doumee.config.shiro;
import com.doumee.service.proxy.CacheProxy;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.context.annotation.Scope;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
 * Shiro缓存
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Scope(value = "prototype")
@Slf4j
@@ -27,8 +31,8 @@
    private String keyPrefix = "";
    @Autowired
    private CacheProxy<Object, Serializable> cacheProxy;
    @Resource(name="sessionRedisTemplate")
    private RedisTemplate<Object, Serializable> redisTemplate;
    public ShiroCache () {
        log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]");
@@ -44,7 +48,7 @@
        if (key == null) {
            return null;
        }
        return cacheProxy.get(getKey(key));
        return redisTemplate.opsForValue().get(getKey(key));
    }
    @Override
@@ -52,7 +56,7 @@
        if (key == null) {
            return null;
        }
        cacheProxy.put(getKey(key), value);
        redisTemplate.opsForValue().set(getKey(key), value);
        return value;
    }
@@ -60,14 +64,14 @@
        if (key == null) {
            return null;
        }
        cacheProxy.put(getKey(key), value, timeout);
        redisTemplate.opsForValue().set(getKey(key), value, timeout, TimeUnit.SECONDS);
        return value;
    }
    @Override
    public void clear() throws CacheException {
        Set<Object> keys = this.keys();
        cacheProxy.remove(keys);
        redisTemplate.delete(keys);
    }
    @Override
@@ -77,7 +81,7 @@
    @Override
    public Set<Object> keys() {
        Set<Object> keys = cacheProxy.keys(keyPrefix + "*");
        Set<Object> keys = redisTemplate.keys(keyPrefix + "*");
        if (CollectionUtils.isEmpty(keys)) {
            return Collections.emptySet();
        }
@@ -92,7 +96,7 @@
            return values;
        }
        for (Object k : keys) {
            values.add(cacheProxy.get(k));
            values.add(redisTemplate.opsForValue().get(k));
        }
        return values;
    }
@@ -103,11 +107,53 @@
            return null;
        }
        Serializable value = this.get(getKey(key));
        cacheProxy.remove(getKey(key));
        redisTemplate.delete(getKey(key));
        return value;
    }
    private Object getKey (Object key) {
        if (key instanceof PrincipalCollection) {
            return this.keyPrefix + getRedisKeyFromPrincipalIdField((PrincipalCollection)key);
        }
        return (key instanceof String ? (this.keyPrefix + key) : key);
    }
    /**
     * èŽ·å–redis cache key
     */
    private String getRedisKeyFromPrincipalIdField(PrincipalCollection key) {
        Object principalObject = key.getPrimaryPrincipal();
        if (principalObject instanceof String) {
            return principalObject.toString();
        } else {
            Method pincipalIdGetter = this.getPrincipalIdGetter(principalObject);
            return this.getIdObj(principalObject, pincipalIdGetter);
        }
    }
    private Method getPrincipalIdGetter(Object principalObject) {
        Method pincipalIdGetter;
        String principalIdMethodName = this.getPrincipalIdMethodName();
        try {
            pincipalIdGetter = principalObject.getClass().getMethod(principalIdMethodName);
            return pincipalIdGetter;
        } catch (NoSuchMethodException e) {
            throw new SerializationException(e.getMessage(), e);
        }
    }
    private String getIdObj(Object principalObject, Method pincipalIdGetter) {
        try {
            Object idObj = pincipalIdGetter.invoke(principalObject);
            String redisKey = idObj.toString();
            return redisKey;
        } catch (Exception e) {
            throw new SerializationException(e.getMessage(), e);
        }
    }
    private String getPrincipalIdMethodName() {
        return "getId";
    }
}
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
@@ -14,7 +14,7 @@
/**
 * è‡ªå®šä¹‰Shiro CacheManager
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Slf4j
@Component
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -10,8 +10,12 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.servlet.Filter;
import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -39,6 +43,20 @@
    @Autowired
    private ShiroRealm shiroRealm;
    @Bean("sessionRedisTemplate")
    public RedisTemplate<Object, Serializable> sessionRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // é»˜è®¤åºåˆ—化方式
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        // å€¼åºåˆ—化方式
        ShiroSessionSerializer serializer = new ShiroSessionSerializer();
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashValueSerializer(serializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator autoProxyCreator = new DefaultAdvisorAutoProxyCreator();
@@ -50,6 +68,9 @@
    public SessionManager sessionManager() {
        ShiroSessionManager sessionManager = new ShiroSessionManager();
        sessionManager.setSessionDAO(shiroSessionDAO);
        sessionManager.setGlobalSessionTimeout(sessionExpireTime*1000);
        // åˆ é™¤å¤±æ•ˆçš„session
        sessionManager.setDeleteInvalidSessions(true);
        return sessionManager;
    }
@@ -66,20 +87,32 @@
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> map = new HashMap<>();
        Map<String, String> map = new LinkedHashMap<>();
        // è·¯å¾„拦截配置
        map.put("/system/login", "anon");
        map.put("/system/syncLingCountData", "anon");
        map.put("/system/wxLogin", "anon");
        map.put("/system/wxProgramLogin", "anon");
        map.put("/system/wxAccountLogin", "anon");
        map.put("/system/initCompany", "anon");
        map.put("/system/logout", "anon");
        map.put("/common/captcha", "anon");
        //文件上传取消拦截
        map.put("/public/**", "anon");
        map.put("/statistics/**", "anon");
        map.put("/dingding/push", "anon");
//        map.put("/ext/workorderExt/freshStatistics", "anon");
        map.put("/dingding/jsapiTicket", "anon");
        map.put("/dingding/ddLogin", "anon");
        map.put("/dingding/getDingdingCorpId", "anon");
        map.put("/lingyang/login", "anon");
        map.put("/lingyang/loginDemo", "anon");
        map.put("/lingyang/importBatch", "anon");
        map.put("/edgp/**", "anon");
        // - æ”¾è¡Œswagger
        map.put("/doc.html", "anon");
        map.put("/webjars/**", "anon");
        map.put("/template/**", "anon");
        map.put("/swagger-resources/**", "anon");
        map.put("/v2/api-docs/**", "anon");
        map.put("/wgListener/**", "anon");
        // - å…¶ä»–接口统一拦截
        map.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
@@ -14,11 +14,10 @@
/**
 * Shiro密码比对处理
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Component
public class ShiroCredentialsMatcher extends HashedCredentialsMatcher {
    @Lazy
    @Autowired
    private SystemUserService systemUserService;
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
@@ -18,7 +18,7 @@
/**
 * è‡ªå®šä¹‰Shiro SessionDAO,将会话信息存入缓存中
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Data
@Slf4j
@@ -30,7 +30,7 @@
    @Autowired
    private ShiroCache shiroCache;
    private int expireTime = 1800;
    private int expireTime = 60 * 60 * 24;
    @Autowired
    private ShiroTokenManager shiroTokenManager;
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
@@ -19,7 +19,7 @@
/**
 * è‡ªå®šä¹‰ä¼šè¯ç®¡ç†å™¨
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Slf4j
public class ShiroSessionManager extends DefaultSessionManager implements WebSessionManager {
@@ -65,7 +65,6 @@
        }
        return sessionId;
    }
    @Override
    public boolean isServletContainerSessions() {
        return false;
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.config.shiro;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.shiro.codec.Base64;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
/**
 * Session序列化
 * @author Eva.Caesar Liu
 * @date 2023/04/17 12:11
 */
public class ShiroSessionSerializer implements RedisSerializer<Serializable> {
    @Override
    public byte[] serialize(Serializable obj) throws SerializationException {
        if (obj == null) {
            return new byte[0];
        }
        String sessionBase64 = Base64.encodeToString(SerializationUtils.serialize(obj));
        return sessionBase64.getBytes(StandardCharsets.UTF_8);
    }
    @Override
    public Serializable deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        String sessionString = new String(bytes, StandardCharsets.UTF_8);
        byte[] sessionBytes = Base64.decode(sessionString);
        return SerializationUtils.deserialize(sessionBytes);
    }
}
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroToken.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.doumee.config.shiro;
import com.doumee.core.model.LoginUserInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.springframework.stereotype.Component;
/**
 * è‡ªå®šä¹‰Token ï¼Œå¤„理认证和权限
 * @author Eva.Caesar Liu
 * @date 2022/04/18 18:12
 */
@Component
public class ShiroToken extends UsernamePasswordToken {
    /**
     * å…¬å¸ID
     */
    Integer companyId;
    Boolean isDdLogin;
    Boolean isWxLogin;
    LoginUserInfo updateUser;
    int updateFlag;
    public ShiroToken() {
    }
    public ShiroToken(Integer companyId, String username, String password, boolean isDdLogin, boolean isWxLogin) {
        super(username,  password, false, (String)null);
        this.companyId = companyId;
        this.isDdLogin = isDdLogin;
        this.isWxLogin = isWxLogin;
    }
    public ShiroToken(LoginUserInfo user,int updateFlag) {
        super(user.getUsername(), "", false, (String)null);
        this.updateUser = user;
        this.updateFlag = updateFlag;
        this.isDdLogin = true;
    }
    public Boolean getDdLogin() {
        return isDdLogin;
    }
    public void setDdLogin(Boolean ddLogin) {
        isDdLogin = ddLogin;
    }
    public Boolean getWxLogin() {
        return isWxLogin;
    }
    public void setWxLogin(Boolean wxLogin) {
        isWxLogin = wxLogin;
    }
    public Integer getCompanyId() {
        return companyId;
    }
    public void setCompanyId(Integer companyId) {
        this.companyId = companyId;
    }
    public LoginUserInfo getUpdateUser() {
        return updateUser;
    }
    public void setUpdateUser(LoginUserInfo updateUser) {
        this.updateUser = updateUser;
    }
    public int getUpdateFlag() {
        return updateFlag;
    }
    public void setUpdateFlag(int updateFlag) {
        this.updateFlag = updateFlag;
    }
}
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
@@ -8,7 +8,7 @@
/**
 * é»˜è®¤Token管理器
 * @author Eva.Caesar Liu
 * @date 2023/03/21 14:49
 * @date 2023/04/17 12:11
 */
@Component
public class ShiroTokenManager {
server/pom.xml
@@ -276,6 +276,10 @@
      <artifactId>commons-net</artifactId>
      <version>3.8.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>