ludc
2023-09-12 7f9d6840cc01c25ac9816df60dbac3d040594fa3
代码提交
已修改8个文件
已添加4个文件
276 ■■■■ 文件已修改
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/config/BladeResourceServerConfiguration.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeTokenEndPoint.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/PwdFreeLoginEndpoint.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyValueVO.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/pagemodel/Tree.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/AuthenticationInterceptor.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/WebConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/PasswordFreeLoginController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyValueServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/config/BladeResourceServerConfiguration.java
@@ -38,6 +38,7 @@
            .antMatchers(
                "/actuator/**",
                "/oauth/captcha",
                "/oauth/passwordFreeLogin",
                "/oauth/logout",
                "/oauth/clear-cache",
                "/oauth/render/**",
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeTokenEndPoint.java
@@ -32,16 +32,34 @@
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.core.tool.utils.WebUtil;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
import org.springframework.security.oauth2.common.exceptions.InvalidRequestException;
import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.security.oauth2.provider.AuthorizationRequest;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.TokenRequest;
import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.util.StringUtils;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.security.Principal;
import java.util.Collections;
import java.util.Map;
import javax.servlet.http.HttpSession;
import java.time.Duration;
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/PwdFreeLoginEndpoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
/*
package com.vci.ubcs.auth.endpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.OAuth2RequestFactory;
import org.springframework.security.oauth2.provider.TokenGranter;
import org.springframework.security.oauth2.provider.TokenRequest;
import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
*/
/**
 * å…å¯†ç™»å½•
 * @author ludc
 * @date 2023/9/12 18:03
 *//*
@Component
public class PwdFreeLoginEndpoint extends TokenEndpoint {
    @Autowired
    private AuthorizationServerTokenServices tokenServices;
    @Autowired
    private ClientDetailsService clientDetailsService;
    @Autowired
    private OAuth2RequestFactory requestFactory;
    @Autowired
    private TokenGranter tokenGranter;
    @RequestMapping(value = "/oauth/password-free-login",method = RequestMethod.GET)
    public ResponseEntity<OAuth2AccessToken> getPasswordFreeLogin(@RequestParam Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        return postPasswordFreeLogin(parameters);
    }
    @RequestMapping(value = "/oauth/password-free-login",method = RequestMethod.POST)
    public ResponseEntity<OAuth2AccessToken> postPasswordFreeLogin(@RequestParam Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        // åˆ¤æ–­æ˜¯å¦æ»¡è¶³å…å¯†ç™»å½•的条件
        if (isSkipLogin(parameters)) {
            // ç”Ÿæˆè®¿é—®ä»¤ç‰Œ
            OAuth2AccessToken accessToken = createAccessToken(parameters);
            // è¿”回访问令牌
            return ResponseEntity.ok(accessToken);
        }
        // ä¸æ»¡è¶³å…å¯†ç™»å½•条件,返回错误信息
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }
    private boolean isSkipLogin(Map<String, String> parameters) {
        // æ ¹æ®å…·ä½“需求判断是否满足免密登录的条件
        // ä¾‹å¦‚,判断请求参数中是否包含某个特定的标识符
        return parameters.containsKey("skipLogin");
    }
    private OAuth2AccessToken createAccessToken(Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        // æž„造请求参数
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        for (Map.Entry<String, String> entry : parameters.entrySet()) {
            params.add(entry.getKey(), entry.getValue());
        }
        // è°ƒç”¨TokenEndpoint的postAccessToken方法生成访问令牌
        return postAccessToken(PrincipalUtils.getPrincipal(), params).getBody();
    }
    private ResponseEntity<OAuth2AccessToken> postAccessToken(Authentication authentication, MultiValueMap<String, String> parameters) throws HttpRequestMethodNotSupportedException {
        // æž„造请求
        TokenRequest tokenRequest = requestFactory.createTokenRequest(parameters, clientDetailsService.loadClientByClientId("your-client-id"));
        // ç”Ÿæˆè®¿é—®ä»¤ç‰Œ
        OAuth2AccessToken accessToken = tokenGranter.grant("password", tokenRequest);
        // è¿”回访问令牌
        return ResponseEntity.ok(accessToken);
    }
}
*/
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyValueVO.java
@@ -23,7 +23,7 @@
    /**
    * åˆ†ç±»ç æ®µä¸»é”®æ˜¾ç¤ºæ–‡æœ¬
    */
    private String codeclassifysecoidName;
    private String codeClassifySecOidName;
    /**
    * ç å€¼åºå·
@@ -61,15 +61,15 @@
    /**
     * èŽ·å–åˆ†ç±»ç æ®µä¸»é”®æ˜¾ç¤ºæ–‡æœ¬
     */
    public String getCodeclassifysecoidName (){
        return codeclassifysecoidName;
    public String getCodeClassifySecOidName (){
        return codeClassifySecOidName;
    }
    /**
    * è®¾ç½®åˆ†ç±»ç æ®µä¸»é”®æ˜¾ç¤ºæ–‡æœ¬
    */
    public void setCodeclassifysecoidName (String codeclassifysecoidName){
        this.codeclassifysecoidName = codeclassifysecoidName;
    public void setCodeClassifySecOidName (String codeclassifysecoidName){
        this.codeClassifySecOidName = codeclassifysecoidName;
    }
    /**
     * èŽ·å– ç å€¼åºå·
@@ -118,16 +118,16 @@
        this.name = name;
    }
    @Override
    public String toString() {
        return "CodeClassifyValueVO{" +
                "codeClassifySecOid='" + codeClassifySecOid + '\'' +
                ", codeclassifysecoidName='" + codeclassifysecoidName + '\'' +
                ", codeClassifySecOidName='" + codeClassifySecOidName + '\'' +
                ", orderNum=" + orderNum +
                ", parentClassifyValueOid='" + parentClassifyValueOid + '\'' +
                ", id='" + id + '\'' +
                ", name='" + name + '\'' +
                "} " + super.toString();
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/pagemodel/Tree.java
@@ -207,6 +207,7 @@
    }
    @Override
    public String toString() {
        return "Tree{oid='" + this.oid + '\'' + ", text='" + this.text + '\'' + ", leaf=" + this.leaf + ", showCheckbox=" + this.showCheckbox + ", checked=" + this.checked + ", children=" + this.children + ", icon='" + this.icon + '\'' + ", iconCls='" + this.iconCls + '\'' + ", parentId='" + this.parentId + '\'' + ", parentName='" + this.parentName + '\'' + ", parentBtmName='" + this.parentBtmName + '\'' + ", expanded=" + this.expanded + ", href='" + this.href + '\'' + ", index='" + this.index + '\'' + ", attributes=" + this.attributes + '}';
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/AuthenticationInterceptor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.vci.ubcs.code.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author ludc
 * @date 2023/9/12 11:49
 */
public class AuthenticationInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/WebConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.vci.ubcs.code.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * webservice接口拦截器
 * @author ludc
 * @date 2023/9/12 11:16
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthenticationInterceptor())
            .addPathPatterns("/api/protected/**");
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/PasswordFreeLoginController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.vci.ubcs.code.controller;
import com.vci.ubcs.code.service.IPasswordFreeLoginService;
import io.swagger.annotations.Api;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * @author ludc
 * @date 2023/9/12 9:07
 */
@RestController
@RequestMapping("/passwordFree")
@Api(value = "免密登录接口", tags = "免密登录接口")
public class PasswordFreeLoginController {
    @Resource
    private IPasswordFreeLoginService passwordFreeLoginService;
    @GetMapping("/login")
    public R passwordFreeLogin(String account) {
        boolean resBoolean = passwordFreeLoginService.passwordFreeLogin(account);
        return R.status(resBoolean);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyValueServiceImpl.java
@@ -101,7 +101,7 @@
        treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
        return revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(CodeClassifyValueVO s) ->{
            //可以在这里处理树节点的显示
            return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
            return s.getId() + " " + (Func.isNotEmpty(s.getName()) ? s.getName():"") + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
                .getLcStatus()) ? (" ã€åœç”¨ã€‘ ") : "");
        });
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
@@ -119,9 +119,6 @@
    @Resource
    private ICodeFixedValueService codeFixedValueService;
    @Resource
    private ICodeClassifyValueService codeClassifyValueService;
    /**
     * åˆ†é¡µæŸ¥è¯¢
     * @param query
@@ -129,7 +126,7 @@
     * @return
     */
    @Override
    public IPage<CodeRuleVO> gridCodeRule(Query query, Map<String,Object> conidtionMap) {
    public IPage<CodeRuleVO> gridCodeRule(Query query, Map<String,Object> conidtionMap) throws VciBaseException {
        //如果等于自己配置的管理组租户id和管理组超管账号,就不需要按照规则所有者来进行查询
        if(!(AuthUtil.getTenantId().equals(nacosConfigCache.getAdminUserInfo().getTenantId())
            && AuthUtil.getUserId().toString().equals(nacosConfigCache.getAdminUserInfo().getUserId().toString()))
@@ -170,7 +167,7 @@
     * @return è¿”回false表示未重复
     */
    @Override
    public boolean checkCodeRuleRepeat(CodeRuleDTO codeRuleDTO){
    public boolean checkCodeRuleRepeat(CodeRuleDTO codeRuleDTO)throws VciBaseException {
        LambdaQueryWrapper<CodeRule> wrapper = Wrappers.<CodeRule>query()
            .lambda().eq(CodeRule::getId, codeRuleDTO.getId());
        if(AuthUtil.getTenantId().equals(nacosConfigCache.getAdminUserInfo().getTenantId())){
@@ -331,7 +328,7 @@
     * @return true表示已经使用,false表示未被使用
     */
    @Override
    public boolean isAlreadyInUse(String oid) {
    public boolean isAlreadyInUse(String oid) throws VciBaseException {
        Collection<CodeClassifyVO> codeClassifyVOS = listUseRangeInCodeClassify(oid);
        if (codeClassifyVOS.size() > 0) {
            return true;
@@ -347,7 +344,7 @@
     * @return ä¸»é¢˜åº“分类使用到该编码规则的所有集合
     */
    @Override
    public Collection<CodeClassifyVO> listUseRangeInCodeClassify(String oid) {
    public Collection<CodeClassifyVO> listUseRangeInCodeClassify(String oid) throws VciBaseException {
        List<CodeClassify> codeClassifies = codeClassifyServcie.selectByWrapper(Wrappers.<CodeClassify>query().lambda().eq(CodeClassify::getCodeRuleOid, oid));
        return CodeClassifyWrapper.build().listVO(codeClassifies);
    }
@@ -400,7 +397,7 @@
     * @param oidCollections ä¸»é”®çš„集合
     * @return æ•°æ®å¯¹è±¡åˆ—表
     */
    private List<CodeRule> listCodeRuleDOByOidCollections(Collection<String> oidCollections) {
    private List<CodeRule> listCodeRuleDOByOidCollections(Collection<String> oidCollections) throws VciBaseException {
        List<CodeRule> codeRuleDOList = new ArrayList<CodeRule>();
        if (!CollectionUtils.isEmpty(oidCollections)) {
            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
@@ -434,7 +431,7 @@
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public R updateStatus(String oid, String update) {
    public R updateStatus(String oid, String update) throws VciBaseException {
        int count = 0;
        //先查询对象
        CodeRule codeRuleDO = selectByOid(oid);
@@ -545,7 +542,7 @@
     * @return è§„则的显示对象
     */
    @Override
    public CodeRuleVO getObjectHasSecByOid(String oid) {
    public CodeRuleVO getObjectHasSecByOid(String oid) throws VciBaseException {
        CodeRule ruleDO = selectByOid(oid);
        return codeRuleDO2VO(ruleDO, true);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -2408,7 +2408,6 @@
        return phaseAttrService.listAttrByTemplateOidAndPhaseId(templateVO.getOid(), phase);
    }
    /**
     * è·¯å¾„上包含当前分类的所有分类信息
     *
@@ -2756,13 +2755,13 @@
            CodeSecTypeEnum.CODE_FIXED_SEC.getValue(),
            CodeSecTypeEnum.CODE_VARIABLE_SEC.getValue(),
            CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue(),
            CodeSecTypeEnum.CODE_REFER_SEC.getValue()
            CodeSecTypeEnum.CODE_REFER_SEC.getValue(),
            CodeSecTypeEnum.CODE_DATE_SEC.getValue()
        );
        // åªè¯»ç æ®µç±»åž‹
        List<String> readOnlyTypes = Arrays.asList(
            CodeSecTypeEnum.CODE_LEVEL_SEC.getValue(),
            CodeSecTypeEnum.CODE_ATTR_SEC.getValue(),
            CodeSecTypeEnum.CODE_DATE_SEC.getValue()
            CodeSecTypeEnum.CODE_ATTR_SEC.getValue()
        );
        // éšè—ç æ®µç±»åž‹
        /*List<String> hideType = Arrays.asList(
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java
@@ -1,8 +1,12 @@
package com.vci.ubcs.code.service.impl;
import com.vci.ubcs.code.service.IPasswordFreeLoginService;
import com.vci.ubcs.code.util.HttpUtils;
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -13,6 +17,9 @@
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.List;
/**
 * å…å¯†ç™»å½•服务
 * @author ludc
@@ -21,8 +28,22 @@
@Service
public class PasswordFreeLoginServiceImpl implements IPasswordFreeLoginService {
    private RestTemplate restTemplate;
    // é€šè¿‡æœåŠ¡æ³¨å†Œä¸­å¿ƒèŽ·å–ç½‘å…³çš„ç«¯å£å·
    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * èŽ·å–ç½‘å…³ç«¯å£
     * @return
     */
    public String getGatewayPort() {
        List<ServiceInstance> instances = discoveryClient.getInstances("ubcs-gateway");
        if (!instances.isEmpty()) {
            ServiceInstance gatewayInstance = instances.get(0);
            return String.valueOf(gatewayInstance.getPort());
        }
        return "80";
    }
    /**
     * å…å¯†ç™»å½•
@@ -32,7 +53,7 @@
    @Override
    public boolean passwordFreeLogin(String account) {
        // å…å¯†ç™»å½•接口地址
        String loginUrl = "http://ubcs-auth/auth/login";
        String loginUrl = "http://localhost:"+this.getGatewayPort()+"/ubcs-auth/oauth/passwordFreeLogin?username=admin&grant_type=captcha&scope=all&type=account";
        // è®¾ç½®è¯·æ±‚头
        HttpHeaders headers = new HttpHeaders();
@@ -42,13 +63,9 @@
        MultiValueMap<String,String> bodyParams = new LinkedMultiValueMap<String,String>();
        bodyParams.add("account",account);
        // åˆ›å»ºè¯·æ±‚实体
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(bodyParams, headers);
        // å‘送POST请求
        ResponseEntity<String> responseEntity = restTemplate.exchange(loginUrl, HttpMethod.POST, requestEntity, String.class);
        String responseBody = responseEntity.getBody();
        String responseBody = HttpUtils.post(loginUrl, bodyParams);
        System.out.println(responseBody);
        //拿到响应体将token存入到redis中,以account作为存储的key
        // è§£æžå“åº”体获取令牌