| | |
| | | package com.vci.ubcs.code.service.impl; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.vci.ubcs.code.config.HeaderMapRequestWrapper; |
| | | import com.vci.ubcs.code.entity.TokenUserObject; |
| | | import com.vci.ubcs.code.service.IPasswordFreeLoginService; |
| | | import com.vci.ubcs.code.util.HttpUtils; |
| | | import org.springblade.core.cache.utils.CacheUtil; |
| | | import io.jsonwebtoken.Claims; |
| | | import org.apache.http.auth.AuthenticationException; |
| | | import org.springblade.core.jwt.JwtUtil; |
| | | import org.springblade.core.jwt.props.JwtProperties; |
| | | import org.springblade.core.log.exception.ServiceException; |
| | | import org.springblade.core.redis.cache.BladeRedis; |
| | | import org.springblade.core.secure.BladeUser; |
| | | import org.springblade.core.tool.support.Kv; |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.core.tool.utils.ObjectUtil; |
| | | import org.springblade.core.tool.utils.SpringUtil; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.cloud.client.ServiceInstance; |
| | |
| | | import org.springframework.util.LinkedMultiValueMap; |
| | | import org.springframework.util.MultiValueMap; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.ServletRequest; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static org.springblade.core.secure.utils.AuthUtil.parseJWT; |
| | | |
| | | /** |
| | | * å
å¯ç»å½æå¡ |
| | |
| | | private BladeRedis bladeRedis; |
| | | // ç¼åå |
| | | public static final String PWD_FREE_LOGIN_TOKEN = "pwdFreeLogin:Token:"; |
| | | private static JwtProperties jwtProperties; |
| | | |
| | | /** |
| | | * è·åç½å
³ç«¯å£ |
| | | * æ ¹æ®æå¡åè·å端å£å· |
| | | * @param serviceId |
| | | * @return |
| | | */ |
| | | private String getGatewayPort() { |
| | | List<ServiceInstance> instances = discoveryClient.getInstances("ubcs-gateway"); |
| | | public String getGatewayPort(String serviceId) { |
| | | List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); |
| | | if (!instances.isEmpty()) { |
| | | ServiceInstance gatewayInstance = instances.get(0); |
| | | return String.valueOf(gatewayInstance.getPort()); |
| | | } |
| | | return "80"; |
| | | } |
| | | |
| | | /** |
| | | * å
å¯ç»å½å¹¶åå
¥ç¼åï¼é
åè¿æ»¤å¨åæ³ |
| | | * @param username è´¦å· |
| | | * @return |
| | | */ |
| | | @Override |
| | | public String passwordFreeLogin(String username, ServletRequest servletRequest) { |
| | | // å
å¯ç»å½æ¥å£å°å |
| | | String loginUrl = "http://localhost:"+this.getGatewayPort()+"/ubcs-auth/oauth/token"; |
| | | // è¯·æ±æ¥èªå·±åªä¸ªipå°å |
| | | HttpServletRequest request = (HeaderMapRequestWrapper) servletRequest; |
| | | String ipAddr = request.getRemoteAddr(); |
| | | // å
å°è¯ä»ç¼åå½ä¸åï¼å¦æä¸åå¨å°±ç»å½ |
| | | String redisToken = (String)bladeRedis.get(PWD_FREE_LOGIN_TOKEN+ipAddr); |
| | | if(Func.isNotBlank(redisToken)){ |
| | | // ç¼åä¸å·²ç»åå¨å°±ç´æ¥å é¤è¯¥ç¼åï¼ä¸»è¦ä¸ºäºé¿å
ç»ä¸ipä¸åå¨å¤ä¸ªtokençæ
åµ |
| | | bladeRedis.del(PWD_FREE_LOGIN_TOKEN+ipAddr); |
| | | } |
| | | // ä¸åå¨å°±éæ°è·å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"); |
| | | |
| | | // åéPOSTè¯·æ± |
| | | String responseBody = HttpUtils.post(loginUrl, parameters,headers); |
| | | //æ¿å°ååºä½å
¶ä¸å
å«token,ç¨requestä¸çipå°åä½ä¸ºé®å¼ï¼å°tokenåå
¥ç¼å |
| | | TokenUserObject tokenUserObject = null; |
| | | try { |
| | | tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); |
| | | }catch (Exception e){ |
| | | throw new ServiceException("responseBody转æ¢TokenUserObject失败:"+e.getMessage()); |
| | | } |
| | | // å°tokenåå
¥ç¼åå½ä¸,è¿ææ¶é´ä¸º24å°æ¶ |
| | | bladeRedis.setEx(PWD_FREE_LOGIN_TOKEN+ipAddr,"bearer "+tokenUserObject.getAccess_token(),60*60*60*24L); |
| | | return responseBody; |
| | | return "8080"; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean passwordFreeLogin2(String username, HttpServletRequest servletRequest) { |
| | | // å
å¯ç»å½æ¥å£å°å |
| | | String loginUrl = "http://localhost:"+this.getGatewayPort()+"/ubcs-auth/oauth/token"; |
| | | |
| | | // è·å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"); |
| | | // åéPOSTè¯·æ± |
| | | String responseBody = HttpUtils.post(loginUrl, parameters,headers); |
| | | //æ¿å°ååºä½å
¶ä¸å
å«token,ç¨requestä¸çipå°åä½ä¸ºé®å¼ï¼å°tokenåå
¥ç¼å |
| | | TokenUserObject tokenUserObject = null; |
| | | try { |
| | | tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); |
| | | }catch (Exception e){ |
| | | throw new ServiceException("responseBody转æ¢TokenUserObject失败:"+e.getMessage()); |
| | | public boolean passwordFreeLogin(String username, ServletRequest servletRequest) throws AuthenticationException { |
| | | //è¿æ¥å
夿ç¼å䏿¯å¦åå¨token |
| | | // è¯·æ±æ¥èªå·±åªä¸ªipå°å |
| | | HttpServletRequest request = (HttpServletRequest) servletRequest; |
| | | String ipAddr = request.getRemoteAddr(); |
| | | // å
å°è¯ä»ç¼åå½ä¸åï¼åå¨å°±ç´æ¥ä»ç¼åä¸è·å |
| | | String authToken = bladeRedis.get(PWD_FREE_LOGIN_TOKEN+ipAddr); |
| | | BladeUser user = null; |
| | | //ä¸åå¨å°±è¯·æ± |
| | | if(Func.isEmpty(authToken)){ |
| | | // å
å¯ç»å½æ¥å£å°å |
| | | String loginUrl = "http://localhost:"+this.getGatewayPort("ubcs-gateway")+"/ubcs-auth/oauth/token"; |
| | | // 请æ±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()); |
| | | } |
| | | //æ¿å°ååºä½å
¶ä¸å
å«token,ç¨requestä¸çipå°åä½ä¸ºé®å¼ï¼å°tokenåå
¥ç¼å |
| | | TokenUserObject tokenUserObject = null; |
| | | try { |
| | | tokenUserObject = JSON.parseObject(responseBody, TokenUserObject.class); |
| | | }catch (Exception e){ |
| | | throw new ServiceException("é´æååºå
容转æ¢ä¸ºTokenUserObject失败:"+e.getMessage()); |
| | | } |
| | | // æ¼æ¥tokenæ ¼å¼ |
| | | authToken = "bearer " + tokenUserObject.getAccess_token(); |
| | | // å°tokenåå
¥ç¼åå½ä¸,è¿ææ¶é´ä¸º24å°æ¶ |
| | | bladeRedis.setEx(PWD_FREE_LOGIN_TOKEN+ipAddr,"bearer "+tokenUserObject.getAccess_token(),60*60*60*24L); |
| | | } |
| | | HttpServletRequest request = (HeaderMapRequestWrapper) servletRequest; |
| | | HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request); |
| | | |
| | | //设置å½åwebæ¥å£ç请æ±å¤´ |
| | | String token = "bearer " + tokenUserObject.getAccess_token(); |
| | | // å°token设置å°headerä¸ |
| | | requestWrapper.setHeader("Blade-Auth", token); |
| | | requestWrapper.setHeader("Authorization","Basic c3dvcmQ6c3dvcmRfc2VjcmV0"); |
| | | |
| | | // å°tokenåå
¥ç¼åå½ä¸,è¿ææ¶é´ä¸º24å°æ¶ |
| | | // è§£ætokenåæ¾è¿atträ¸ |
| | | String token2 = JwtUtil.getToken(authToken); |
| | | user = this.getUser(token2); |
| | | //request.setAttribute("Blade-Auth",token); |
| | | request.setAttribute("_BLADE_USER_REQUEST_ATTR_",user); |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®tokenè·åç¨æ·ä¿¡æ¯ |
| | | * @param token |
| | | * @return |
| | | */ |
| | | private static BladeUser getUser(String token) { |
| | | Claims claims = getClaims(token); |
| | | if (claims == null) { |
| | | return null; |
| | | } else { |
| | | String clientId = Func.toStr(claims.get("client_id")); |
| | | Long userId = Func.toLong(claims.get("user_id")); |
| | | String tenantId = Func.toStr(claims.get("tenant_id")); |
| | | String oauthId = Func.toStr(claims.get("oauth_id")); |
| | | String deptId = Func.toStrWithEmpty(claims.get("dept_id"), "-1"); |
| | | String postId = Func.toStrWithEmpty(claims.get("post_id"), "-1"); |
| | | String roleId = Func.toStrWithEmpty(claims.get("role_id"), "-1"); |
| | | String account = Func.toStr(claims.get("account")); |
| | | String roleName = Func.toStr(claims.get("role_name")); |
| | | String userName = Func.toStr(claims.get("user_name")); |
| | | String nickName = Func.toStr(claims.get("nick_name")); |
| | | String tenantName = Func.toStr(claims.get("tenantName")); |
| | | String email = Func.toStr(claims.get("email")); |
| | | String deptName = Func.toStr(claims.get("deptName")); |
| | | String secretGrade = Func.toStr(claims.get("secretGrade")); |
| | | Kv detail = Kv.create().setAll((Map)claims.get("detail")); |
| | | BladeUser bladeUser = new BladeUser(); |
| | | bladeUser.setClientId(clientId); |
| | | bladeUser.setUserId(userId); |
| | | bladeUser.setTenantId(tenantId); |
| | | bladeUser.setOauthId(oauthId); |
| | | bladeUser.setAccount(account); |
| | | bladeUser.setDeptId(deptId); |
| | | bladeUser.setPostId(postId); |
| | | bladeUser.setRoleId(roleId); |
| | | bladeUser.setRoleName(roleName); |
| | | bladeUser.setUserName(userName); |
| | | bladeUser.setNickName(nickName); |
| | | detail.put("tenantName", tenantName); |
| | | detail.put("deptName", deptName); |
| | | detail.put("email", email); |
| | | detail.put("secretGrade", secretGrade); |
| | | bladeUser.setDetail(detail); |
| | | return bladeUser; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è§£ætoken |
| | | * @param authToken |
| | | * @return |
| | | */ |
| | | private static Claims getClaims(String authToken) { |
| | | Claims claims = null; |
| | | String token = null; |
| | | String tenantId; |
| | | if (StringUtil.isNotBlank(authToken)) { |
| | | token = JwtUtil.getToken(authToken); |
| | | } |
| | | |
| | | if (StringUtil.isNotBlank(token)) { |
| | | claims = parseJWT(token); |
| | | } |
| | | |
| | | if (ObjectUtil.isNotEmpty(claims) && getJwtProperties().getState()) { |
| | | tenantId = Func.toStr(claims.get("tenant_id")); |
| | | String userId = Func.toStr(claims.get("user_id")); |
| | | String accessToken = JwtUtil.getAccessToken(tenantId, userId, token); |
| | | if (!token.equalsIgnoreCase(accessToken)) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | return claims; |
| | | } |
| | | |
| | | private static JwtProperties getJwtProperties() { |
| | | if (jwtProperties == null) { |
| | | jwtProperties = (JwtProperties) SpringUtil.getBean(JwtProperties.class); |
| | | } |
| | | |
| | | return jwtProperties; |
| | | } |
| | | |
| | | |
| | | } |