ludc
2023-09-21 bfdb7930b76669cc30b5494a42d61b7fb7859924
代码提交
已修改7个文件
已添加1个文件
240 ■■■■ 文件已修改
Source/UBCS-WEB/src/views/system/user.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeSocialEndpoint.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/AESUtils.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/PasswordFreeLoginController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/IPasswordFreeLoginService.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/user.vue
@@ -404,6 +404,7 @@
              {
                label: '密码',
                prop: 'password',
                type: "password",
                hide: true,
                editDisplay: false,
                viewDisplay: false,
@@ -413,6 +414,7 @@
                label: '确认密码',
                prop: 'password2',
                hide: true,
                type: "password",
                editDisplay: false,
                viewDisplay: false,
                rules: [{required: true, validator: validatePass2, trigger: 'blur'}]
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeSocialEndpoint.java
@@ -62,22 +62,6 @@
    }
    /**
     * ä¸ŽOA系统的单点登录
     */
    @GetMapping("/oauth/oasso")
    public ModelAndView require(HttpServletRequest request, ModelAndView model) {
        // 1、拿到用户的鉴权信息
        String userName = request.getParameter("username");
        // 2、调用鉴权登录接口,这里采用授权码模式
        // 3、构建请求地址,
        //HttpUtils.post();
        model.setViewName("login");
        return model;
    }
    /**
     * èŽ·å–è®¤è¯ä¿¡æ¯
     */
    @RequestMapping("/oauth/callback/{source}")
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/AESUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.vci.ubcs.starter.util;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
/**
 * @author ludc
 * @date 2023/9/20 11:08
 */
public class AESUtils {
    /**
     * aes加密
     * @param content å¾…加密数据
     * @param key å¯†é’¥
     * @return
     * @throws Exception
     */
    public static String aesEncrypt(String content, String key) throws Exception {
        //指定加密算法
        Cipher cipher = Cipher.getInstance("AES");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
        //指定加密模式为加密,指定加密规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        //调用加密方法
        byte[] result = cipher.doFinal(content.getBytes());
        //用Base64编码
        return new String(Base64.getEncoder().encode(result));
    }
    /**
     * aes解密
     * @param content å¾…解密数据
     * @param key å¯†é’¥
     * @return
     * @throws Exception
     */
    public static String aesDecrypt(String content, String key) throws Exception {
        //Base64解码
        byte[] result = Base64.getDecoder().decode(content);
        //指定加密算法
        Cipher cipher = Cipher.getInstance("AES");
        //创建加密规则:指定key和加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
        //指定加密模式为解密,指定加密规则
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        return new String(cipher.doFinal(result));
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -658,7 +658,6 @@
        return engineService.getFlowUIInfoByClassifyOid(codeClassifyOid,functionId,templateId,taskId,modelKey);
    }
    @GetMapping("/thisistest")
    @ResponseBody
    public Integer thisistest(String codeClassifyOid, String functionId) throws Exception {
@@ -726,7 +725,7 @@
     * @param referConfigVO å‚照的配置信息
     * @return æ‰§è¡Œçš„结果
     */
    @GetMapping("/defaultReferDataGrid")
    @RequestMapping(value = "/defaultReferDataGrid",method = {RequestMethod.POST, RequestMethod.GET})
    public IPage<BaseModelVO> defaultReferDataGrid(UIFormReferVO referConfigVO, BaseQueryObject baseQueryObject){
        return engineService.referDataGrid(referConfigVO,baseQueryObject);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/PasswordFreeLoginController.java
@@ -2,12 +2,18 @@
import com.vci.ubcs.code.service.IPasswordFreeLoginService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static com.vci.ubcs.starter.util.AESUtils.aesDecrypt;
import static com.vci.ubcs.starter.util.AESUtils.aesEncrypt;
/**
 * @author ludc
@@ -16,20 +22,40 @@
@RestController
@RequestMapping("/passwordFree")
@Api(value = "免密登录接口", tags = "免密登录接口")
@Slf4j
public class PasswordFreeLoginController {
    @Resource
    private IPasswordFreeLoginService passwordFreeLoginService;
    @PostMapping("/login")
    public R passwordFreeLogin(@RequestParam String username, HttpServletRequest request) {
    public R passwordFreeLogin(@RequestParam("userName") String username, HttpServletRequest request) {
        boolean status;
        try {
            status = passwordFreeLoginService.passwordFreeLogin(username,request);
            status = passwordFreeLoginService.pwdFreeLoginByBoolean(username,request);
        }catch (Exception e){
            throw new ServiceException("免密登录获取token失败:"+e.getMessage());
        }
        return R.status(status);
    }
    /**
     * å•点登录
     * @param request
     * @return
     * @throws Exception
     */
    @GetMapping("/ssoLogin")
    public ModelAndView oaSsoLogin(HttpServletRequest request, ModelAndView model){
        String token;
        try {
            token = passwordFreeLoginService.ssoFreeLogin(request);
        }catch (Exception e){
            throw new ServiceException("单点登录获取token失败:"+e.getMessage());
        }
        model.addObject("token",token);
        model.setViewName("sso");
        return model;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/IPasswordFreeLoginService.java
@@ -19,10 +19,28 @@
    String getGatewayPort(String serviceId);
    /**
     * å…å¯†ç™»å½•方法
     * å…å¯†ç™»å½•,改变当前webservice请求的header
     * @param userName è´¦å·
     * @return
     * @param servletRequest
     * @return boolean
     * @throws AuthenticationException
     */
    boolean passwordFreeLogin(String userName, ServletRequest request) throws AuthenticationException;
    boolean pwdFreeLoginByBoolean(String userName, ServletRequest servletRequest) throws AuthenticationException;
    /**
     * å…å¯†ç™»å½•请求发送
     * @param userName è´¦å·
     * @return è¿”回token
     * @throws AuthenticationException
     */
    String passwordFreeLogin(String userName) throws AuthenticationException;
    /**
     * å•点登录
     * @param servletRequest
     * @return
     * @throws Exception
     */
    String ssoFreeLogin(ServletRequest servletRequest) throws Exception;
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/PasswordFreeLoginServiceImpl.java
@@ -33,6 +33,8 @@
import java.util.Map;
import java.util.logging.Logger;
import static com.vci.ubcs.starter.util.AESUtils.aesDecrypt;
import static com.vci.ubcs.starter.util.AESUtils.aesEncrypt;
import static org.springblade.core.secure.utils.AuthUtil.parseJWT;
/**
@@ -47,14 +49,23 @@
    // é€šè¿‡æœåŠ¡æ³¨å†Œä¸­å¿ƒèŽ·å–ç½‘å…³çš„ç«¯å£å·
    @Autowired
    private DiscoveryClient discoveryClient;
    // é…ç½®çš„免密登录的账号所属的租户id
    @Value("${password-free.pwd-free-tenant-id}")
    @Value("${password-free.pwd-free-tenant-id:000000}")
    private String pwdFreeTenantId;
    // é…ç½®çš„token在redis中的生存时间
    @Value("${password-free.token-redis-expire}")
    @Value("${password-free.token-redis-expire:36000}")
    private Long tokenRedisExpire;
    @Value("${password-free.pwd-free-addr}")
    @Value("${password-free.pwd-free-addr:localhost}")
    private String pwdFreeAddr;
    @Value("${password-free.client-id:a104c4fd2f0e4958}")
    private String clientId;//应用ID
    @Value("${password-free.secret-key:9fbd170bd83eb869}")
    private String secretKey;//应用秘钥
    @Autowired
    private BladeRedis bladeRedis;
@@ -79,10 +90,12 @@
    /**
     * å…å¯†ç™»å½•,改变当前webservice请求的header
     * @param userName è´¦å·
     * @return
     * @param servletRequest
     * @return boolean
     * @throws AuthenticationException
     */
    @Override
    public boolean passwordFreeLogin(String userName, ServletRequest servletRequest) throws AuthenticationException {
    public boolean pwdFreeLoginByBoolean(String userName, ServletRequest servletRequest) throws AuthenticationException {
        //进来先判断缓存中是否存在token
        // è¯·æ±‚来自己哪个ip地址
        HttpServletRequest request = (HttpServletRequest) servletRequest;
@@ -94,27 +107,7 @@
        BladeUser user = this.getUser(token2);
        //不存在就请求
        if(Func.isEmpty(authToken) || Func.isEmpty(user)){
            // å…å¯†ç™»å½•接口地址
            String loginUrl = "http://"+pwdFreeAddr+":"+this.getGatewayPort("ubcs-gateway")+"/ubcs-auth/oauth/token";
            log.debug("当前免密登录调用地址:"+loginUrl);
            // è¯·æ±‚ubcs-auth服务获取token,先设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            headers.set("Authorization", "Basic c3dvcmQ6c3dvcmRfc2VjcmV0");
            headers.set("Tenant-Id", pwdFreeTenantId);
            //设置请求体参数
            MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>();
            parameters.add("username",userName);
            parameters.add("grant_type", "passwordfree");
            parameters.add("scope", "all");
            parameters.add("type", "account");
            String responseBody = null;
            try {
                // å‘送POST请求
                responseBody = HttpUtils.post(loginUrl, parameters,headers);
            }catch (Exception e){
                throw new AuthenticationException("调用鉴权服务ubcs-auth失败,原因:"+e.getMessage());
            }
            String responseBody = this.passwordFreeLogin(userName);
            //拿到响应体其中包含token,用request中的ip地址作为键值,将token存入缓存
            TokenUserObject tokenUserObject = null;
            try {
@@ -132,6 +125,63 @@
        //request.setAttribute("Blade-Auth",token);
        request.setAttribute("_BLADE_USER_REQUEST_ATTR_",user);
        return true;
    }
    /**
     * å…å¯†ç™»å½•请求发送
     * @param userName è´¦å·
     * @return è¿”回token
     * @throws AuthenticationException
     */
    @Override
    public String passwordFreeLogin(String userName) throws AuthenticationException {
        // å…å¯†ç™»å½•接口地址
        String loginUrl = "http://"+pwdFreeAddr+":"+this.getGatewayPort("ubcs-gateway")+"/ubcs-auth/oauth/token";
        log.debug("当前免密登录调用地址:"+loginUrl);
        // è¯·æ±‚ubcs-auth服务获取token,先设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.set("Authorization", "Basic c3dvcmQ6c3dvcmRfc2VjcmV0");
        headers.set("Tenant-Id", pwdFreeTenantId);
        //设置请求体参数
        MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>();
        parameters.add("username",userName);
        parameters.add("grant_type", "passwordfree");
        parameters.add("scope", "all");
        parameters.add("type", "account");
        String responseBody = null;
        try {
            // å‘送POST请求
            responseBody = HttpUtils.post(loginUrl, parameters,headers);
        }catch (Exception e){
            throw new AuthenticationException("调用鉴权服务ubcs-auth失败,原因:"+e.getMessage());
        }
        return responseBody;
    }
    /**
     * å•点登录
     * @param servletRequest
     * @return
     * @throws Exception
     */
    @Override
    public String ssoFreeLogin(ServletRequest servletRequest) throws Exception {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String content = request.getHeader("empCode");
        if(Func.isBlank(content)){
            throw new ServiceException("未获取到empCode参数");
        }
        //加密
        String str1 = aesEncrypt(content, clientId);
        String str2 = aesEncrypt(str1, secretKey);
        String enStr1 = aesDecrypt(str2, secretKey);
        String enStr2 = aesDecrypt(enStr1, clientId);
        // è§£å¯†
        log.debug("单点登录参数解密后:"+enStr2);
        String token = this.passwordFreeLogin("pwdfree");
        return token;
    }
    /**
@@ -215,6 +265,5 @@
        return jwtProperties;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -237,7 +237,7 @@
            systemId = interParameterVO.getData().getSystemId();
            UserVO userVo = interParameterVO.getData().getUser();
            //免密登录申请token,request中添加用户信息
            passwordFreeLoginService.passwordFreeLogin(userVo.getUserName(),this.getRequest());
            passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
            AuthUtil.getUser();
            List<ClassfyVO> classVOList = classfysVO.getClassify();
            InterParameterVO finalInterParameterVO = interParameterVO;
@@ -975,7 +975,7 @@
            systemId = interParameterVO.getData().getSystemId();
            UserVO userVo = interParameterVO.getData().getUser();
            //免密登录申请token,request中添加用户信息
            passwordFreeLoginService.passwordFreeLogin(userVo.getUserName(),this.getRequest());
            passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
            List<ClassfyVO> classVOList = classfysVO.getClassify();
            InterParameterVO finalInterParameterVO = interParameterVO;
            //这是账号信息
@@ -1148,7 +1148,7 @@
            QueryData queryData=queryClassifyVO.getData();
            UserVO userVo=queryData.getUser();
            //免密登录申请token,request中添加用户信息
            passwordFreeLoginService.passwordFreeLogin(userVo.getUserName(),this.getRequest());
            passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
            systemId=queryData.getSystemId();
            QueryLibraryVO libraryVO= queryData.getLibrary();
            String libId= libraryVO.getId();
@@ -1308,7 +1308,7 @@
            systemId=condtionsVO.getSystemId();
            UserVO userVo=condtionsVO.getUser();
            //免密登录申请token,request中添加用户信息
            passwordFreeLoginService.passwordFreeLogin(userVo.getUserName(),this.getRequest());
            passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
            CondtionVO condtionVO= condtionsVO.getCondtion();
            SessionInfo sessionInfo = new SessionInfo();
            sessionInfo.setUserId(userVo.getUserName());
@@ -1523,7 +1523,7 @@
            QueryData queryData=queryClassifyVO.getData();
            UserVO userVo=queryData.getUser();
            //免密登录申请token,request中添加用户信息
            passwordFreeLoginService.passwordFreeLogin(userVo.getUserName(),this.getRequest());
            passwordFreeLoginService.pwdFreeLoginByBoolean(userVo.getUserName(),this.getRequest());
            systemId=queryData.getSystemId();
            QueryLibraryVO libraryVO= queryData.getLibrary();
            String libId= libraryVO.getId();