Browse Source

集抄平台接入

hym 4 years ago
parent
commit
8dd87fc413

+ 4 - 0
gateway/pom.xml

@@ -34,6 +34,10 @@
         </dependencies>
     </dependencyManagement>
     <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-commons</artifactId>

+ 73 - 0
gateway/src/main/java/com/huaxu/gateway/config/AuthGatewayFilter.java

@@ -0,0 +1,73 @@
+package com.huaxu.gateway.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.core.Ordered;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+@Component
+public class AuthGatewayFilter implements GatewayFilter, Ordered {
+    @Autowired
+    RedisTemplate<String, String> redisTemplate;
+    public static final String tokenHead = "Bearer ";
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+
+        List<String> list =  exchange.getRequest().getHeaders().get("Authorization");
+        String token = null;
+        if(list != null && list.size() > 0){
+            String authHeader = list.get(0);
+            token = authHeader.substring(tokenHead.length());
+        }else {
+            MultiValueMap<String,String> map = exchange.getRequest().getQueryParams();
+            String rmcpToken = getParam(map,"token");
+            if (rmcpToken != null) {
+                token = rmcpToken;
+            }
+        }
+
+        String iotTokenKey = "iotToken:" + token;
+        String iotToken = redisTemplate.opsForValue().get(iotTokenKey);
+        if (iotToken != null) {
+            redisTemplate.expire(iotTokenKey,30*60, TimeUnit.SECONDS);
+            Consumer<HttpHeaders> httpHeaders = httpHeader -> {
+                httpHeader.set("Authorization", "Bearer " + iotToken);
+            };
+            ServerHttpRequest newRequest = exchange.getRequest().mutate().headers(httpHeaders).build();
+            return chain.filter(exchange.mutate().request(newRequest).build());
+        }else {
+            return chain.filter(exchange);
+        }
+
+
+    }
+
+
+    @Override
+    public int getOrder() {
+        return 10;
+    }
+
+    private String getParam(MultiValueMap<String, String> map, String param) {
+        if (map != null) {
+            List<String> list = map.get(param);
+            if (list != null && list.size() > 0) {
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+}

+ 19 - 0
gateway/src/main/java/com/huaxu/gateway/config/AuthGatewayFilterFactory.java

@@ -0,0 +1,19 @@
+package com.huaxu.gateway.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<Object>
+{
+    @Autowired
+    private AuthGatewayFilter authGatewayFilter;
+
+    @Override
+    public GatewayFilter apply(Object config)
+    {
+        return authGatewayFilter;
+    }
+}

+ 11 - 1
gateway/src/main/resources/application-dev.properties

@@ -5,7 +5,11 @@ logging.path=D:/logs/smart-city-v2-gateway
 logging.level.com.alibaba.nacos.client.naming=error
 #指定服务名
 spring.application.name=gateway
-
+spring.redis.host=114.135.61.188
+spring.redis.port=26379
+spring.redis.password=zoniot
+spring.redis.database=2
+spring.redis.timeout=36000
 #nacos
 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
 
@@ -42,5 +46,11 @@ spring.cloud.gateway.routes[5].uri=lb://operation-manager
 spring.cloud.gateway.routes[5].predicates[0]=Path=/operation-manager/**
 spring.cloud.gateway.routes[5].filters[0]=StripPrefix=1
 
+spring.cloud.gateway.routes[6].id=iot
+spring.cloud.gateway.routes[6].uri=http://localhost:8090
+spring.cloud.gateway.routes[6].predicates[0]=Path=/iot/api/**
+spring.cloud.gateway.routes[6].filters[0]=StripPrefix=1
+spring.cloud.gateway.routes[6].filters[1]=Auth
+
 spring.servlet.multipart.max-file-size=100MB
 spring.servlet.multipart.max-request-size=100MB

+ 15 - 4
user_auth/src/main/java/com/huaxu/controller/UserController.java

@@ -160,7 +160,7 @@ public class UserController {
         int result = userService.insertRegister(user);
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
-    @RequestMapping(value = "getUserStatus")
+    @RequestMapping(value = "getUserStatus", method = RequestMethod.GET)
     @ApiOperation(value = "获取用户当前状态",notes = "返回0代表超时,1有其他用户登录了,其他用户被禁用")
     public AjaxMessage<Integer> getUserStatus(@ApiParam(value = "accessToken", required = true)@RequestParam String accessToken) {
        String key="offlineStatus:"+ accessToken;
@@ -170,11 +170,22 @@ public class UserController {
             Optional<Integer> status = ByteArrayUtils.bytesToObject(bytes);
             result=status.get();
         }
-
-
-
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
+    @RequestMapping(value = "getRangeCode", method = RequestMethod.GET)
+    @ApiOperation(value = "获取登录随机code")
+    public AjaxMessage<String> getRangeCode(@ApiParam(value = "appId", required = true)@RequestParam String appId) {
+        String code=userService.getRangeCode(appId);
+        return new AjaxMessage<String>(ResultStatus.OK, code);
+    }
+    @RequestMapping(value = "getUniqId", method = RequestMethod.GET)
+    @ApiOperation(value = "获取用户标识")
+    public AjaxMessage<String> getUniqId(@ApiParam(value = "appId", required = true)@RequestParam String appId,
+                                         @ApiParam(value = "appSecret", required = true)@RequestParam String appSecret,
+                                         @ApiParam(value = "code", required = true)@RequestParam String code                                    ) {
+        String uniqId=userService.getUniqId(appId,appSecret,code);
+        return new AjaxMessage<String>(ResultStatus.OK, uniqId);
+    }
 
 
 }

+ 5 - 0
user_auth/src/main/java/com/huaxu/dao/UserMapper.java

@@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户(User)表数据库访问层
@@ -105,4 +106,8 @@ public interface UserMapper {
     List<MenuEntity> findAllFirstMenu();
 
     List<MenuEntity> findTenantFirstMenu(String tenantId);
+
+    String getUniqueUserID(Integer id);
+
+    String getAppSecret(String appId);
 }

+ 1 - 0
user_auth/src/main/java/com/huaxu/entity/User.java

@@ -101,5 +101,6 @@ public class User implements Serializable {
     private String token;
     private Integer roleState;
     private Integer tenantState;
+    private String iotPhoneNumber;
 
 }

+ 2 - 38
user_auth/src/main/java/com/huaxu/security/MyAuthenticationSuccessHandler.java

@@ -62,8 +62,7 @@ public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticat
     @Autowired
     private UserService userService;
 
-    @Value("${iot.url}")
-    private String iotUrl;
+
     @Autowired
     private RedisUtil redisUtil;
 
@@ -108,13 +107,7 @@ public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticat
         responseUserLoginDto.setLoginInfo(JSONArray.parseArray(loginUser.getUserInfos(), UserDto.class));
         JSONObject result=new JSONObject();
 
-        //可以加一个映射表
-        /*String iotToken=getLoginIotToken(loginUser.getPhoneNumber());
-        if(iotToken!=null){
-            String iotTokenKey = "iotToken:" + token;
-            redisUtil.set(iotTokenKey,iotToken);
-            redisUtil.setExpire(iotTokenKey,60*30);
-        }*/
+
         result.put("token",token);
         result.put("userInfos",loginUser.getUserInfos());
 
@@ -124,36 +117,7 @@ public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticat
 
         response.getWriter().write(objectMapper.writeValueAsString(ajaxMessage));
     }
-    public String getLoginIotToken(String account){
-        log.info("begin IotService login account={}",account);
-        String url = iotUrl + "/api/integration/auth/login";
-         RestTemplate restTemplate = new RestTemplate();
-        MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
-        map.add("source","rmcp");
-        map.add("code",new BASE64Encoder().encode(account.getBytes()));
-        HttpHeaders headers = new HttpHeaders();
-        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map,headers);
-        ResponseEntity<JSONObject> responseEntity  = restTemplate.postForEntity(url, request, JSONObject.class);
-        log.info("responseEntity ={}", JSONObject.toJSONString(responseEntity));
-        if(responseEntity !=null && responseEntity.getStatusCode() == HttpStatus.OK){
-            JSONObject jsonObject =  responseEntity.getBody();
-            if(jsonObject != null){
-                if(jsonObject.getInteger("status")==0){
-                    String token = jsonObject.getString("data");
-                    log.info("IotService getLoginIotToken success res={}",token);
-                    return token;
-                }else {
-                    log.info("IotService getLoginIotToken fail");
-                    return null;
-
-                }
-            }else {
-                return null;
-            }
-        }
 
-        return null;
-    }
 
 
 }

+ 1 - 1
user_auth/src/main/java/com/huaxu/security/config/ResourceServerConfig.java

@@ -40,7 +40,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .requestMatchers().antMatchers("/**")
                 .and()
                 .authorizeRequests()
-                .antMatchers("/user/getUserStatus","/sms/**","/statics/**","/validateCode/image","/user/**").permitAll()
+                .antMatchers("/user/getUniqId","/user/getUserStatus","/sms/**","/statics/**","/validateCode/image","/user/**").permitAll()
                 .antMatchers("/swagger-ui.html","/webjars/**", "/webjars/**", "/swagger-resources/**",
                         "/v2/**"
                         )

+ 1 - 1
user_auth/src/main/java/com/huaxu/security/smsCode/SmsCodeCheckUserFilter.java

@@ -66,7 +66,7 @@ public class SmsCodeCheckUserFilter extends OncePerRequestFilter {
         String smsCode = request.getParameter("smsCode");
         String mobile = request.getParameter("mobile");
         log.info("validate mobile={},smsCode={}",mobile,smsCode);
-        boolean sitFlag=active.equals("sit")||active.equals("prd");
+        boolean sitFlag=active.equals("sit")||active.equals("prd")||active.equals("dev");
         if (sitFlag&& StringUtils.equals(smsCode,"2020")) {
             return;
         }

+ 4 - 0
user_auth/src/main/java/com/huaxu/service/UserService.java

@@ -94,4 +94,8 @@ public interface UserService {
     int insertRegister(User user);
      void offline(String clientId, Integer userId, Integer status);
 
+    String getRangeCode(String appId);
+
+
+    String getUniqId(String appId, String appSecret, String code);
 }

+ 84 - 2
user_auth/src/main/java/com/huaxu/service/impl/UserServiceImpl.java

@@ -1,5 +1,6 @@
 package com.huaxu.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import com.huaxu.dao.LoginLogMapper;
@@ -19,11 +20,17 @@ import com.huaxu.util.ByteArrayUtils;
 import com.huaxu.util.RedisUtil;
 import com.huaxu.util.UserUtil;
 import com.huaxu.util.Util;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -34,7 +41,11 @@ import org.springframework.security.oauth2.provider.token.AuthorizationServerTok
 import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
 import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.util.ReflectionUtils;
+import org.springframework.web.client.RestTemplate;
+import sun.misc.BASE64Encoder;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
@@ -47,6 +58,7 @@ import java.util.stream.Collectors;
  * @since 2020-10-21 15:23:52
  */
 @Service("userService")
+@Slf4j
 public class UserServiceImpl implements UserService {
     @Autowired
     private UserMapper userMapper;
@@ -65,7 +77,8 @@ public class UserServiceImpl implements UserService {
     private LoginLogMapper loginLogMapper;
     @Autowired
     private TokenStore tokenStore;
-
+    @Value("${iot.url}")
+    private String iotUrl;
 
     /**
      * 通过ID查询单条数据
@@ -184,6 +197,37 @@ public class UserServiceImpl implements UserService {
             tokenStore.removeAccessToken(oAuth2AccessToken);
         }
     }
+
+    @Override
+    public String getRangeCode(String appId) {
+        LoginUser currentUser = UserUtil.getCurrentUser();
+        Integer id = currentUser.getId();
+        String appSecret=userMapper.getAppSecret(appId);
+        String uniqueUserID=userMapper.getUniqueUserID(id);
+        Random random = new Random();
+        String code="";
+
+
+        if(uniqueUserID!=null){
+            for (int i=0;i<6;i++)
+            {
+                code+=random.nextInt(10);
+            }
+            String key=code+"_"+appId+"_"+appSecret;
+            redisUtil.set(key,uniqueUserID);
+            redisUtil.setExpire(key,300);
+        }
+
+        return code;
+    }
+
+    @Override
+    public String getUniqId(String appId, String appSecret, String code) {
+        String key=code+"_"+appId+"_"+appSecret;
+        return redisUtil.get(key);
+    }
+
+
     @Override
     public User chooseUser(User user) {
 
@@ -273,12 +317,50 @@ public class UserServiceImpl implements UserService {
         OAuth2Authentication oAuth2AuthenticationNew = new OAuth2Authentication(oAuth2Authentication.getOAuth2Request(), authenticationTokenReslut);
 
         OAuth2AccessToken accessToken = authorizationServerTokenServices.createAccessToken(oAuth2AuthenticationNew);
-
+        //可以加一个映射表
+        String iotToken=getLoginIotToken(user.getIotPhoneNumber());
+        if(iotToken!=null){
+            String iotTokenKey = "iotToken:" + accessToken.getValue();
+            redisUtil.set(iotTokenKey,iotToken);
+            redisUtil.setExpire(iotTokenKey,60*30);
+        }
         insertLoginLog(loginUser,"登录");
         user.setToken(accessToken.getValue());
         return user;
     }
+    public String getLoginIotToken(String account){
+        log.info("begin IotService login account={}",account);
+        String url = iotUrl + "/api/integration/auth/login";
+        RestTemplate restTemplate = new RestTemplate();
+        if(account==null){
+            return null;
+        }
+        MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
+        map.add("source","rmcp");
+        map.add("code",new BASE64Encoder().encode(account.getBytes()));
+        HttpHeaders headers = new HttpHeaders();
+        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map,headers);
+        ResponseEntity<JSONObject> responseEntity  = restTemplate.postForEntity(url, request, JSONObject.class);
+        log.info("responseEntity ={}", JSONObject.toJSONString(responseEntity));
+        if(responseEntity !=null && responseEntity.getStatusCode() == HttpStatus.OK){
+            JSONObject jsonObject =  responseEntity.getBody();
+            if(jsonObject != null){
+                if(jsonObject.getInteger("status")==0){
+                    String token = jsonObject.getString("data");
+                    log.info("IotService getLoginIotToken success res={}",token);
+                    return token;
+                }else {
+                    log.info("IotService getLoginIotToken fail");
+                    return null;
 
+                }
+            }else {
+                return null;
+            }
+        }
+
+        return null;
+    }
     private void getDataPermission(int permissionType,User user, List<ProgramItem> programItemList){
         ProgramItem defaultProgramItem=new ProgramItem();
         defaultProgramItem.setOrgCompanyId(-999);

+ 9 - 2
user_auth/src/main/resources/mapper/UserMapper.xml

@@ -24,6 +24,7 @@
         <result property="companyOrgState" column="companyOrgState" jdbcType="INTEGER"/>
         <result property="departmentOrgState" column="departmentOrgState" jdbcType="INTEGER"/>
         <result property="tenantState" column="TENANT_STATE" jdbcType="INTEGER"/>
+        <result property="iotPhoneNumber" column="iot_phone_number" jdbcType="VARCHAR"/>
     </resultMap>
 
 
@@ -50,8 +51,8 @@
     <!--通过实体作为筛选条件查询-->
     <select id="selectList" resultMap="UserMap">
         select
-       b.TENANT_STATE, a.*, b.LOGO,b.WEB_URL ,c.ORG_STATE companyOrgState,d.ORG_STATE departmentOrgState
-        from uims_user a join uims_tenant b on a.TENANT_ID=b.CODE
+       b.TENANT_STATE, a.*, b.LOGO,b.WEB_URL ,c.ORG_STATE companyOrgState,d.ORG_STATE departmentOrgState,
+       b.iot_phone_number from uims_user a join uims_tenant b on a.TENANT_ID=b.CODE
         join uims_org c on a.COMPANY_ORG_ID=c.id left join
         uims_org d on a.DEPT_ORG_ID=d.ID
         <where>
@@ -331,4 +332,10 @@
         </where>
         order by b.MENU_SEQ
     </select>
+    <select id="getAppSecret" resultType="string">
+        select APP_SECRET_KEY from uims.uims_app where APP_ID=#{appId}
+    </select>
+    <select id="getUniqueUserID" resultType="string">
+        select uniq_id from uims.uims_user where id=#{id}
+    </select>
 </mapper>