diff --git a/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/config/WebSecurityConfiguration.java b/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/config/WebSecurityConfiguration.java index 635157cf4af28a58ef5cd8dfdbbf69234920edc1..8c9ea10fce584a7f1cb175802b0a5dd26a573014 100644 --- a/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/config/WebSecurityConfiguration.java +++ b/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/config/WebSecurityConfiguration.java @@ -80,7 +80,7 @@ public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { .failureHandler(authenticationFailureHandler()).and().logout() .logoutSuccessHandler(logoutSuccessHandler()).deleteCookies("JSESSIONID").invalidateHttpSession(true) .and() - .authorizeRequests().antMatchers("/**/login","/token/**", "/actuator/**", "/mobile/**", "/oauth/token").permitAll() + .authorizeRequests().antMatchers("/**/login","/token/**", "/actuator/**", "/mobile/**", "/oauth/token","/weixin/callback").permitAll() .anyRequest().authenticated().and().csrf().disable(); } diff --git a/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/endpoint/YifuTokenEndpoint.java b/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/endpoint/YifuTokenEndpoint.java index c3c0044b1de511ff777022bdcb7f50d235676b50..09519e098025a5016b671426c7042e9e3bb4c76f 100644 --- a/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/endpoint/YifuTokenEndpoint.java +++ b/yifu-auth/src/main/java/com/yifu.cloud.plus.v1/yifu/auth/endpoint/YifuTokenEndpoint.java @@ -18,34 +18,54 @@ package com.yifu.cloud.plus.v1.yifu.auth.endpoint; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yifu.cloud.plus.v1.yifu.admin.api.dto.UserInfo; +import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysUser; +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginTool; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback.WeixinLoginCallback; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinError; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinUserInfo; +import com.yifu.cloud.plus.v1.yifu.auth.vo.WxUserVo; import com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants; import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants; +import com.yifu.cloud.plus.v1.yifu.common.core.constant.SecurityConstants; +import com.yifu.cloud.plus.v1.yifu.common.core.util.Common; import com.yifu.cloud.plus.v1.yifu.common.core.util.R; import com.yifu.cloud.plus.v1.yifu.common.core.util.SpringContextHolder; +import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser; +import com.yifu.cloud.plus.v1.yifu.common.dapr.config.DaprUpmsProperties; +import com.yifu.cloud.plus.v1.yifu.common.dapr.util.HttpDaprUtil; import com.yifu.cloud.plus.v1.yifu.common.security.annotation.Inner; +import com.yifu.cloud.plus.v1.yifu.common.security.util.AuthUtils; import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpHeaders; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.event.LogoutSuccessEvent; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2RefreshToken; -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.OAuth2Authentication; +import org.springframework.security.oauth2.common.exceptions.InvalidClientException; +import org.springframework.security.oauth2.provider.*; +import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestValidator; +import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -56,8 +76,12 @@ import java.util.stream.Collectors; @RestController @RequiredArgsConstructor @RequestMapping("/token") +@EnableConfigurationProperties(DaprUpmsProperties.class) +@Tag(name = "获å–Token") public class YifuTokenEndpoint { + private final DaprUpmsProperties daprUpmsProperties; + private final ClientDetailsService clientDetailsService; private final TokenStore tokenStore; @@ -66,6 +90,36 @@ public class YifuTokenEndpoint { private final CacheManager cacheManager; + private final PasswordEncoder passwordEncoder; + + private final AuthorizationServerTokenServices defaultAuthorizationServerTokenServices; + + /** + * 构建userdetails + * + * @param result ç”¨æˆ·ä¿¡æ¯ + * @return + */ + private UserDetails getUserDetails(R<UserInfo> result) { + if (result == null || result.getData() == null) { + throw new UsernameNotFoundException("用户ä¸å˜åœ¨"); + } + UserInfo info = result.getData(); + // 获å–èµ„æº + Set<String> dbAuthsSet = new HashSet<>(Arrays.asList(info.getPermissions())); + Collection<? extends GrantedAuthority> authorities + = AuthorityUtils.createAuthorityList(dbAuthsSet.toArray(new String[0])); + SysUser user = info.getSysUser(); + // æž„é€ security用户 + YifuUser thisUser = new YifuUser(user.getUserId(), user.getDeptId(),user.getDeptName(), user.getUsername(), + user.getNickname(),user.getSystemFlag(), SecurityConstants.BCRYPT + user.getPassword(), + user.getPhone(), true, true, true, + CommonConstants.STATUS_NORMAL.equals(user.getLockFlag()), + user.getUserGroup(),authorities, user.getLdapDn()); + thisUser.setClientRoleMap(info.getClientRoleMap()); + return thisUser; + } + /** * 认è¯é¡µé¢ * @param modelAndView @@ -165,4 +219,90 @@ public class YifuTokenEndpoint { return R.ok(result); } + /** + * 微信扫ç å›žè°ƒç™»å½•ä¸šåŠ¡å¤„ç† + * @param code + * @param state å®¢æˆ·ç«¯åŠ å¯†ä¸² + * @param type 0 或空 å–值é…ç½® 1 å–å€¼ä¼ å‚ + * @return + */ + @GetMapping(value = "/weixin/callback") + @ResponseBody + public String wxCallback(HttpServletRequest request,@RequestParam String code, String state, String type, String appid , String secret) { + return LoginTool.loginTwo(code, appid, secret, getCallback(request, state)); + } + + private WeixinLoginCallback getCallback(HttpServletRequest request, String state) { + return new WeixinLoginCallback() { + @Override + public String handle(WeixinUserInfo userInfo) { + if (null != userInfo && null != userInfo.getOpenid()) { + SysUser user = new SysUser(); + user.setWxOpenid(userInfo.getOpenid()); + R<UserInfo> result = HttpDaprUtil.invokeMethodPost(daprUpmsProperties.getAppUrl(), daprUpmsProperties.getAppId() + , "/user/inner/getSysUserByWxOpenId", user, UserInfo.class, SecurityConstants.FROM_IN); + OAuth2AccessToken oAuth2AccessToken = null; + if (null != result && null != result.getData() && result.getData().getSysUser() != null) { + SysUser sysUser = result.getData().getSysUser(); + if (!CommonConstants.ZERO_STRING.equals(sysUser.getLockFlag())) { + return JSON.toJSONString(R.failed("用户".concat(sysUser.getNickname()).concat("è´¦å·ï¼š").concat(sysUser.getUsername()).concat("已被é”定,请è”系管ç†å‘˜ã€‚"))); + } + UserDetails userDetails = getUserDetails(result); + try { + String header = request.getHeader(com.yifu.cloud.plus.v1.yifu.auth.constants.SecurityConstants.CLIENT_HEADER_KEY_NEW); + if(Common.isEmpty(header)){ + header = request.getHeader(com.yifu.cloud.plus.v1.yifu.auth.constants.SecurityConstants.CLIENT_HEADER_KEY); + //兼容è€é€»è¾‘ + if(Common.isEmpty(header)){ + header = request.getHeader(HttpHeaders.AUTHORIZATION); + } + } + if (Common.isEmpty(header)) { + throw new InvalidClientException("请求头ä¸clientä¿¡æ¯ä¸ºç©º"); + } + String[] tokens = AuthUtils.extractAndDecodeHeader(header); + assert tokens.length == 2; + String clientId = tokens[0]; + ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); + //æ ¡éªŒsecret + if (!passwordEncoder.matches(tokens[1], clientDetails.getClientSecret())) { + throw new InvalidClientException("Given client ID does not match authenticated client"); + + } + TokenRequest tokenRequest = new TokenRequest(MapUtil.newHashMap(), clientId, clientDetails.getScope(), "mobile"); + + //æ ¡éªŒscope + new DefaultOAuth2RequestValidator().validateScope(tokenRequest, clientDetails); + OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken + (userDetails, userDetails.getPassword()); + OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); + oAuth2AccessToken = defaultAuthorizationServerTokenServices.createAccessToken(oAuth2Authentication); + } catch (Exception e) { + log.info("客户端解æžå‡ºé”™ã€‚"); + return JSON.toJSONString(R.failed("æ— æ¤å®¢æˆ·ç«¯")); + } + WxUserVo wxUserVo = new WxUserVo(); + wxUserVo.setOauth2AccessToken(oAuth2AccessToken); + wxUserVo.setWeixinUserInfo(userInfo); + wxUserVo.setUser(sysUser); + return JSON.toJSONString(R.ok(wxUserVo)); + } else { + return JSON.toJSONString(R.other(userInfo, "该用户未注册", CommonConstants.REGISTERED)); + } + } + //查询用户 + log.info("登录æˆåŠŸä¸šåŠ¡å¤„ç†"); + return JSON.toJSONString(R.failed("openid为空")); + } + + @Override + public String errer(WeixinError error) { + log.info("登录失败业务处ç†"); + log.error(error.getErrmsg()); + return JSON.toJSONString(R.failed(error.getErrmsg())); + } + }; + } + } diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/AuthBeanAutoConfiguration.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/AuthBeanAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..b947ba13ea4bf81b8d9d44c34c0d1e2f6f3d43b6 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/AuthBeanAutoConfiguration.java @@ -0,0 +1,8 @@ +package com.yifu.cloud.plus.v1.yifu.auth; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AuthBeanAutoConfiguration { + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/AbstractLoginService.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/AbstractLoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..6e03c9d8bf921895357f28ae9b42bd444cd4a08c --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/AbstractLoginService.java @@ -0,0 +1,39 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.client.RestTemplate; + +/** + * 三方登录æœåŠ¡æŽ¥å…¥ + * @author daijie_jay + * @since 2017å¹´11月29æ—¥ + */ +public abstract class AbstractLoginService<T extends LoginProperties> implements LoginService { + + protected static final String REDIRECT = "redirect:"; + + @Autowired + protected RestTemplate restTemplate; + + @Autowired + protected T properties; + + public String getRedirectUrl() { + return REDIRECT + properties.getRedirectUri(); + } + + public String getErrorUrl() { + return REDIRECT + properties.getErrorUri(); + } + + @SuppressWarnings("unchecked") + @Override + public T getProperties(){ + return properties; + } + + @Override + public String loadAuthPage() { + return this.loadAuthPage(null); + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginCallback.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..733251b4403528e09328e1e2addd18c22a9daf63 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginCallback.java @@ -0,0 +1,17 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + + +public interface LoginCallback<T, E> { + + /** + * 登录æˆåŠŸåŽé€»è¾‘处ç†ï¼Œå¤„ç†ç»“æŸå¦‚æžœæœ‰åˆ™è¿”å›žé”™è¯¯ä¿¡æ¯ + * @param userInfo 第三方用户实体 + */ + public String handle(T userInfo); + + /** + * 登录失败åŽé€»è¾‘å¤„ç† ï¼Œå¤„ç†ç»“æŸå¦‚æžœæœ‰åˆ™è¿”å›žé”™è¯¯ä¿¡æ¯ + * @param error 第三方错误实体 + */ + public String errer(E error); +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginProperties.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..3c42a477ec60d61323ff2e28c929f343640c313f --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginProperties.java @@ -0,0 +1,81 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 登录属性é…ç½®åˆå§‹åŒ– + */ +// @Component +public class LoginProperties { + + /*public String appid = "wxcb81e4a2ad8d9012"; + + public String appsecret = "546f366801ad42fec8e67393ed484879";*/ + + public String appid = "wxfb3a14ee64c87046"; + + public String appsecret = "e2143c5a1f635e039122de27f29354fe"; + + public String redirectUri = "https://www.ngrok.xiaomiqiu.cn/admin/hi"; + + public String errorUri = "/error"; + + public String callbackUri = "https://www.ngrok.xiaomiqiu.cn/oauth/weixin/callback"; + + /*@Value("${weixin.login.appid}") + protected String appid; + + @Value("${weixin.login.appsecret}") + protected String appsecret; + + @Value("${weixin.login.redirectUri}") + protected String redirectUri; + + @Value("${weixin.login.errorUri}") + protected String errorUri; + + @Value("${weixin.login.callbackUri}") + protected String callbackUri;*/ + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getAppsecret() { + return appsecret; + } + + public void setAppsecret(String appsecret) { + this.appsecret = appsecret; + } + + public String getRedirectUri() { + return redirectUri; + } + + public void setRedirectUri(String redirectUri) { + this.redirectUri = redirectUri; + } + + public String getErrorUri() { + return errorUri; + } + + public void setErrorUri(String errorUri) { + this.errorUri = errorUri; + } + + public String getCallbackUri() { + return callbackUri; + } + + public void setCallbackUri(String callbackUri) { + this.callbackUri = callbackUri; + } + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginResult.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginResult.java new file mode 100644 index 0000000000000000000000000000000000000000..9975999d43aaf795184ade7f4abdb4fe873c8dae --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginResult.java @@ -0,0 +1,13 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + +/** + * 返回结果 + */ +public interface LoginResult { + + /** + * 是å¦æ£å¸¸è¿”回 + * @return Boolean + */ + Boolean getResult(); +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginService.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..2a21fecc0c9d50e7f187dec9be00671b745d9dfe --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginService.java @@ -0,0 +1,23 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + +/** + * 三方登录æœåŠ¡æŽ¥å…¥ + */ +public interface LoginService { + + public <T extends LoginProperties> T getProperties(); + + /** + * åŠ è½½ç¬¬ä¸‰æ–¹æŽˆæƒé¡µ + * @return String + */ + String loadAuthPage(); + + /** + * åŠ è½½ç¬¬ä¸‰æ–¹æŽˆæƒé¡µ + * @param state æ•°æ®å£°æ˜Ž + * @return String + */ + String loadAuthPage(String state); + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginTool.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginTool.java new file mode 100644 index 0000000000000000000000000000000000000000..c9062ae8e7b849fa8d128fdb89c91ed95e6890e8 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/LoginTool.java @@ -0,0 +1,22 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util; + + +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoginTool; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback.WeixinLoginCallback; + +@SuppressWarnings("unchecked") +public class LoginTool { + + /** + * 支æŒå‰ç«¯ä¼ 惨 appid secret 兼容 多个公众å·çš„情况 + * @param appAuthCode + * @param appid + * @param secret + * @param callback + * @return + */ + public static String loginTwo(String appAuthCode, String appid ,String secret, LoginCallback callback){ + return WeixinLoginTool.login(appAuthCode,appid,secret, (WeixinLoginCallback) callback); + } + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/annotation/EnableWeixinLogin.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/annotation/EnableWeixinLogin.java new file mode 100644 index 0000000000000000000000000000000000000000..50cd13e773be0192f14ed2a7e3114ab991a68e4f --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/annotation/EnableWeixinLogin.java @@ -0,0 +1,16 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.annotation; + +import com.yifu.cloud.plus.v1.yifu.auth.AuthBeanAutoConfiguration; +import com.yifu.cloud.plus.v1.yifu.auth.util.config.WeixinLoginBeanAutoConfiguration; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoginTool; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import({AuthBeanAutoConfiguration.class, WeixinLoginBeanAutoConfiguration.class, WeixinLoginTool.class}) +public @interface EnableWeixinLogin { + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/config/WeixinLoginBeanAutoConfiguration.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/config/WeixinLoginBeanAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..d820aa26ce1d3c4ae6b18c067741a0233bf631fc --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/config/WeixinLoginBeanAutoConfiguration.java @@ -0,0 +1,26 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.config; + +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoignProperties; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback.WeixinLoginCallbackController; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.service.WeixinLoginService; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 微信登录自动装置 + */ +//@Configuration +// @EnableConfigurationProperties({WeixinLoignProperties.class}) +public class WeixinLoginBeanAutoConfiguration { + + @Bean("weixinLoginService") + public WeixinLoginService loginService() { + return new WeixinLoginService(); + } + + @Bean + public WeixinLoginCallbackController loginCallbackController() { + return new WeixinLoginCallbackController(); + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginConstants.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..3051a31604e7f6547ecbb298c4fe83cfddd78ffb --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginConstants.java @@ -0,0 +1,20 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin; + +/** + * 微信登录常é‡é…ç½® + */ +public class WeixinLoginConstants { + + public static final String HOST_API = "https://api.weixin.qq.com"; + + /** + * 临时code获å–accessToken + */ + public static final String ACCESS_TOKEN = "/sns/oauth2/access_token"; + + /** + * 获å–ç”¨æˆ·ä¿¡æ¯ + */ + public static final String USER_INFO = "/sns/userinfo"; + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginTool.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginTool.java new file mode 100644 index 0000000000000000000000000000000000000000..e8afcbe0f0d633f934a9cf0f903999c1e647bdb0 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoginTool.java @@ -0,0 +1,65 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin; + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginResult; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback.WeixinLoginCallback; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinAccessToken; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinError; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinUserInfo; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.service.WeixinLoginService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 微信登录工具 + */ +@Component +public class WeixinLoginTool { + + private static WeixinLoginService wxLoginService; + + @Autowired + public void setWeixinLoginService(WeixinLoginService wxLoginService) { + WeixinLoginTool.wxLoginService = wxLoginService; + } + + /** + * 微信登录 + * 实用于已得到微信临时code + * @param appAuthCode 临时code + * @param callback 回调函数 + * @return String + */ + public static String login(String appAuthCode, WeixinLoginCallback callback){ + LoginResult result = wxLoginService.getAccessToken(appAuthCode); + if(result.getResult()){ + WeixinAccessToken accessToken = (WeixinAccessToken) result; + result = wxLoginService.getWxUserInfo(accessToken); + if(result.getResult()){ + WeixinUserInfo userInfo = (WeixinUserInfo) result; + return callback.handle(userInfo); + } + } + + return callback.errer((WeixinError) result); + } + + /** + * 微信登录 + * 实用于已得到微信临时code + * @param appAuthCode 临时code + * @param callback 回调函数 + * @return String + */ + public static String login(String appAuthCode, String appid ,String secret, WeixinLoginCallback callback){ + LoginResult result = wxLoginService.getAccessToken(appAuthCode,appid,secret); + if(result.getResult()){ + WeixinAccessToken accessToken = (WeixinAccessToken) result; + result = wxLoginService.getWxUserInfo(accessToken); + if(result.getResult()){ + WeixinUserInfo userInfo = (WeixinUserInfo) result; + return callback.handle(userInfo); + } + } + return callback.errer((WeixinError) result); + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoignProperties.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoignProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..e6cb57f72a87f57803a31ff2af08b97669c02dae --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/WeixinLoignProperties.java @@ -0,0 +1,21 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin; + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginProperties; +import org.springframework.stereotype.Component; + +/** + * 微信登录属性é…ç½®åˆå§‹åŒ– + */ +@Component +public class WeixinLoignProperties extends LoginProperties { + + private String token; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallback.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..6ce0710288a00435708d19b3456fd14128f672b4 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallback.java @@ -0,0 +1,13 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback; + + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginCallback; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinError; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinUserInfo; + +/** + * 微信登录回调 + */ +public interface WeixinLoginCallback extends LoginCallback<WeixinUserInfo, WeixinError> { + +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallbackController.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallbackController.java new file mode 100644 index 0000000000000000000000000000000000000000..cdade06e404d095cb6bad2dd28fc1f7d3740120d --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/callback/WeixinLoginCallbackController.java @@ -0,0 +1,23 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.callback; + +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoginTool; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 微信登录扫æ回调 + */ +/*@Controller*/ +public class WeixinLoginCallbackController { + + /** + * 处ç†å›žè°ƒä¸šåŠ¡ + * @param code 临时code + * @param state æ•°æ®å£°æ˜Ž + * @param callback 回调函数 + * @return String + */ + /*@GetMapping(value = WeixinLoginConstants.LOGIN_CALLBACK)*/ + public String callback(@RequestParam String code, String state, WeixinLoginCallback callback){ + return WeixinLoginTool.login(code, callback); + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinAccessToken.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinAccessToken.java new file mode 100644 index 0000000000000000000000000000000000000000..366fbeb1beccba1ce7df0914b17fd09127c403cc --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinAccessToken.java @@ -0,0 +1,70 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model; + + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginResult; + +/** + * 微信认è¯æƒé™çš„实体 + */ +public class WeixinAccessToken implements LoginResult { + + //接å£è°ƒç”¨å‡è¯ + private String access_token; + + //access_token接å£è°ƒç”¨å‡è¯è¶…时时间,å•ä½ï¼ˆç§’) + private Long expires_in; + + //用户刷新access_token + private String refresh_token; + + //授æƒç”¨æˆ·å”¯ä¸€æ ‡è¯† + private String openid; + + //用户授æƒçš„作用域,使用逗å·ï¼ˆ,)分隔 + private String scope; + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public Long getExpires_in() { + return expires_in; + } + + public void setExpires_in(Long expires_in) { + this.expires_in = expires_in; + } + + public String getRefresh_token() { + return refresh_token; + } + + public void setRefresh_token(String refresh_token) { + this.refresh_token = refresh_token; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + @Override + public Boolean getResult() { + return true; + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinError.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinError.java new file mode 100644 index 0000000000000000000000000000000000000000..db75b4358ff90bf54f50c75b145ac1ecb9f0f02a --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinError.java @@ -0,0 +1,35 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model; + + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginResult; + +/** + * é”™è¯¯ä¿¡æ¯ + */ +public class WeixinError implements LoginResult { + + private String errcode; + + private String errmsg; + + public String getErrcode() { + return errcode; + } + + public void setErrcode(String errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + @Override + public Boolean getResult() { + return false; + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinUserInfo.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinUserInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..f59674b6d2031359e8d13e6cdc837a1348f277c1 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/model/WeixinUserInfo.java @@ -0,0 +1,116 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model; + + +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginResult; + +import java.util.List; + +/** + * ç”¨æˆ·ä¿¡æ¯ + */ +public class WeixinUserInfo implements LoginResult { + + //æ™®é€šç”¨æˆ·çš„æ ‡è¯†ï¼Œå¯¹å½“å‰å¼€å‘者å¸å·å”¯ä¸€ + private String openid; + + //普通用户昵称 + private String nickname; + + //普通用户性别,1为男性,2为女性 + private Integer sex; + + //普通用户个人资料填写的çœä»½ + private String province; + + //普通用户个人资料填写的城市 + private String city; + + //国家,如ä¸å›½ä¸ºCN + private String country; + + //用户头åƒï¼Œæœ€åŽä¸€ä¸ªæ•°å€¼ä»£è¡¨æ£æ–¹å½¢å¤´åƒå¤§å°ï¼ˆæœ‰0ã€46ã€64ã€96ã€132数值å¯é€‰ï¼Œ0代表640*640æ£æ–¹å½¢å¤´åƒï¼‰ï¼Œç”¨æˆ·æ²¡æœ‰å¤´åƒæ—¶è¯¥é¡¹ä¸ºç©º + private String headimgurl; + + //用户特æƒä¿¡æ¯ï¼Œjson数组,如微信沃å¡ç”¨æˆ·ä¸ºï¼ˆchinaunicom) + private List<String> privilege; + + //ç”¨æˆ·ç»Ÿä¸€æ ‡è¯†ã€‚é’ˆå¯¹ä¸€ä¸ªå¾®ä¿¡å¼€æ”¾å¹³å°å¸å·ä¸‹çš„应用,åŒä¸€ç”¨æˆ·çš„unionid是唯一的。 + private String unionid; + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getHeadimgurl() { + return headimgurl; + } + + public void setHeadimgurl(String headimgurl) { + this.headimgurl = headimgurl; + } + + public List<String> getPrivilege() { + return privilege; + } + + public void setPrivilege(List<String> privilege) { + this.privilege = privilege; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } + + @Override + public Boolean getResult() { + return true; + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/service/WeixinLoginService.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/service/WeixinLoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..b95460403c7b483fdf057ff930e4f21777a452b8 --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/util/weixin/service/WeixinLoginService.java @@ -0,0 +1,116 @@ +package com.yifu.cloud.plus.v1.yifu.auth.util.weixin.service; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yifu.cloud.plus.v1.yifu.auth.util.AbstractLoginService; +import com.yifu.cloud.plus.v1.yifu.auth.util.LoginResult; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoginConstants; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.WeixinLoignProperties; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinAccessToken; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinError; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinUserInfo; +import com.yifu.cloud.plus.v1.yifu.common.core.util.Common; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +/** + * 微信登录æœåŠ¡ + */ +@Service +public class WeixinLoginService extends AbstractLoginService<WeixinLoignProperties> { + + private static final Logger logger = LoggerFactory.getLogger(WeixinLoginService.class); + + public LoginResult getAccessToken(String code) { + StringBuilder uri = new StringBuilder(); + uri.append(WeixinLoginConstants.HOST_API + WeixinLoginConstants.ACCESS_TOKEN + "?appid="); + uri.append(properties.getAppid()); + uri.append("&secret=").append(properties.getAppsecret()); + uri.append("&code=" + code).append("&grant_type=authorization_code"); + try { + String url = uri.toString(); + String result = restTemplate.getForObject(url, String.class); + JSONObject json = JSONUtil.parseObj(result); + if(json.getStr("access_token") != null){ + WeixinAccessToken accessToken = new WeixinAccessToken(); + accessToken.setAccess_token(json.getStr("access_token")); + accessToken.setOpenid(json.getStr("open_id")); + accessToken.setExpires_in(json.getLong("expires_in")); + accessToken.setRefresh_token(json.getStr("refresh_token")); + accessToken.setScope(json.getStr("scope")); + return accessToken; + }else{ + WeixinError error = new WeixinError(); + error.setErrcode(json.getStr("errcode")); + error.setErrmsg(json.getStr("errmsg")); + return error; + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + public LoginResult getAccessToken(String code,String appid ,String secret) { + StringBuilder uri = new StringBuilder(); + uri.append(WeixinLoginConstants.HOST_API + WeixinLoginConstants.ACCESS_TOKEN + "?appid="); + if (Common.isNotNull(appid) && Common.isNotNull(secret)){ + uri.append(appid); + uri.append("&secret=").append(secret); + }else { + uri.append(properties.getAppid()); + uri.append("&secret=").append(properties.getAppsecret()); + } + uri.append("&code=" + code).append("&grant_type=authorization_code"); + try { + String url = uri.toString(); + String result = restTemplate.getForObject(url, String.class); + JSONObject json = JSONUtil.parseObj(result); + if(json.getStr("access_token") != null){ + WeixinAccessToken accessToken = new WeixinAccessToken(); + accessToken.setAccess_token(json.getStr("access_token")); + accessToken.setOpenid(json.getStr("open_id")); + accessToken.setExpires_in(json.getLong("expires_in")); + accessToken.setRefresh_token(json.getStr("refresh_token")); + accessToken.setScope(json.getStr("scope")); + return accessToken; + }else{ + WeixinError error = new WeixinError(); + error.setErrcode(json.getStr("errcode")); + error.setErrmsg(json.getStr("errmsg")); + return error; + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + public LoginResult getWxUserInfo(WeixinAccessToken accessToken) { + StringBuilder uri = new StringBuilder(); + uri.append(WeixinLoginConstants.HOST_API + WeixinLoginConstants.USER_INFO + "?access_token="); + uri.append(accessToken.getAccess_token()); + uri.append("&openid=" + accessToken.getOpenid()); + uri.append("&lang=zh_CN"); + try { + String result = restTemplate.getForObject(uri.toString(), String.class); + WeixinUserInfo userInfo = JSONUtil.toBean(result, WeixinUserInfo.class); + if(userInfo != null && null != userInfo.getOpenid()){ + return userInfo; + }else{ + WeixinError error = JSONUtil.toBean(result, WeixinError.class); + return error; + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + + @Override + public String loadAuthPage(String state) { + return null; + } +} diff --git a/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/vo/WxUserVo.java b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/vo/WxUserVo.java new file mode 100644 index 0000000000000000000000000000000000000000..f2af119ab1740a443759894946bd1ecfd5446e3b --- /dev/null +++ b/yifu-auth/src/main/java/com/yifu/cloud/plus/v1/yifu/auth/vo/WxUserVo.java @@ -0,0 +1,19 @@ +package com.yifu.cloud.plus.v1.yifu.auth.vo; + +import com.yifu.cloud.plus.v1.yifu.admin.api.entity.SysUser; +import com.yifu.cloud.plus.v1.yifu.auth.util.weixin.model.WeixinUserInfo; +import lombok.Data; +import org.springframework.security.oauth2.common.OAuth2AccessToken; + +/** + * @program: master + * @description: 微信返回包装类 + * @author: pwang + * @create: 2020-08-10 21:11 + **/ +@Data +public class WxUserVo { + private OAuth2AccessToken oauth2AccessToken; + private WeixinUserInfo weixinUserInfo; + private SysUser user; +} diff --git a/yifu-auth/src/main/resources/application-dev.yml b/yifu-auth/src/main/resources/application-dev.yml index 44f2b9b07297349fcacc88085a737553669d9bab..b9c85b4971270654235aebd0985362bdb70c86db 100644 --- a/yifu-auth/src/main/resources/application-dev.yml +++ b/yifu-auth/src/main/resources/application-dev.yml @@ -36,3 +36,10 @@ spring: prefer-file-system-access: true suffix: .ftl template-loader-path: classpath:/templates/ +weixin: + login: + appid: wxfb3a14ee64c87046 + appsecret: e2143c5a1f635e039122de27f29354fe + redirectUri: https://www.ngrok.xiaomiqiu.cn/admin/hi + errorUri: /error + callbackUri: https://www.ngrok.xiaomiqiu.cn/oauth/weixin/callback diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/constant/CommonConstants.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/constant/CommonConstants.java index 6e1857b50da334a2329b1553a8b9c810270ee8ad..197f05891c66b37211168820bf2c211c0810f21c 100644 --- a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/constant/CommonConstants.java +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/constant/CommonConstants.java @@ -133,6 +133,7 @@ public interface CommonConstants { String FIVE_STRING = "5"; String TWELVE_STRING = "12"; + int TWELVE_INT = 12; String THIRTEEN_STRING = "13"; @@ -530,4 +531,10 @@ public interface CommonConstants { // C端å‰ç¼€ public static final String C_PREFIX = CacheConstants.DEFAULT_CODE_KEY.concat("_C_"); + + /** + * 用户未注册 + */ + public static final Integer REGISTERED = 3; + } diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/R.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/R.java index 2c96dba6c56de2a0e6430d081d4dfa87ba382919..220c9191ca074139c27765bceadf1916bf7f95a6 100644 --- a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/R.java +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/R.java @@ -91,6 +91,9 @@ public class R<T> implements Serializable { public static <T> R<T> other(int code, String msg) { return restResult(null, code, msg); } + public static <T> R<T> other(T data, String msg, int code) { + return restResult(data, code, msg); + } private static <T> R<T> restResult(T data, int code, String msg) { R<T> apiResult = new R<>(); diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/HttpConversationUtil.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/HttpConversationUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..3f702cbe2779443c0056c078406a097f81555166 --- /dev/null +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/HttpConversationUtil.java @@ -0,0 +1,121 @@ +package com.yifu.cloud.plus.v1.yifu.common.core.util.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * 获å–http会è¯æ•°æ®çš„工具类 + * + * @author daijie + * @since 2017å¹´6月5æ—¥ + */ +public class HttpConversationUtil { + + private static Logger logger = LoggerFactory.getLogger(HttpConversationUtil.class); + + /** + * 获å–当å‰è¯·æ±‚ä¼šè¯ + * @return HttpServletRequest + */ + public static HttpServletRequest getRequest(){ + return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); + } + + /** + * 获å–当å‰å“åº”ä¼šè¯ + * @return HttpServletResponse + */ + public static HttpServletResponse getResponse(){ + return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); + } + + /** + * 获å–当å‰è¯·æ±‚会è¯IP + * @return String + */ + public static String getIP(){ + String ip = getRequest().getHeader("x-forwarded-for"); + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ + ip = getRequest().getHeader("Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ + ip = getRequest().getHeader("WL-Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ + ip = getRequest().getRemoteAddr(); + } + return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip; + } + + /** + * 获å–请求Body转æ¢ä¸ºjsonå—符串 + * + * @return String + */ + public static String getBodyString() { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + BufferedReader reader = null; + try { + inputStream = getRequest().getInputStream(); + reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); + String line = ""; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + logger.info("未读å–到请求bodyä¸æ•°æ®"); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + logger.info("未读å–到请求bodyä¸æ•°æ®"); + } + } + } + return sb.toString(); + } + + /** + * 得到所有的å‚数的值 + * @return Map + */ + public static Map<String,Object> handelRequest(){ + Map<String,Object> obj = new HashMap<String,Object>(); + Enumeration<String> coll = getRequest().getParameterNames(); + while(coll.hasMoreElements()){ + String key = coll.nextElement(); + obj.put(key, getRequest().getParameter(key)==null?"":getRequest().getParameter(key) ); + } + if(obj.get("pageSize")!=null || obj.get("pageNumber")!=null){ + int pageSize = Integer.valueOf(obj.get("pageSize").toString()); + int pageNumber = Integer.valueOf(obj.get("pageNumber").toString()); + int startIndex = (pageNumber - 1) * pageSize; + obj.put("startIndex", startIndex); + obj.put("pageSize", pageSize); + obj.put("pageNumber", pageNumber); + } + return obj; + } +} diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/EncodingUtil.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/EncodingUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4f9e6c79248c6b9b372b0b6fe64d17cf98a10e4d --- /dev/null +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/EncodingUtil.java @@ -0,0 +1,56 @@ +package com.yifu.cloud.plus.v1.yifu.common.core.util.http.htapi; + +import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +/** + * 仿JS ç¼–ç 解ç + * @Author fxj + * @Date 2020-11-13 + * @return + **/ +public class EncodingUtil { + public static String decodeURIComponent(String s) { + if (s == null) { + return null; + } + + String result = null; + + try { + result = URLDecoder.decode(s, CommonConstants.UTF8); + } + + // This exception should never occur. + catch (UnsupportedEncodingException e) { + result = s; + } + + return result; + } + public static String encodeURIComponent(String s) { + String result = null; + + try { + result = URLEncoder.encode(s, CommonConstants.UTF8) + .replaceAll("\\+", "%20") + .replaceAll("\\%21", "!") + .replaceAll("\\%27", "'") + .replaceAll("\\%28", "(") + .replaceAll("\\%29", ")") + .replaceAll("\\%7E", "~"); + } + + // This exception should never occur. + catch (UnsupportedEncodingException e) { + result = s; + } + + return result; + } + private EncodingUtil() { + super(); + } +} diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/ResultBean.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/ResultBean.java new file mode 100644 index 0000000000000000000000000000000000000000..f5e83ad210c5190fcc6bd94e408787ff2556442e --- /dev/null +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/util/http/htapi/ResultBean.java @@ -0,0 +1,18 @@ +package com.yifu.cloud.plus.v1.yifu.common.core.util.http.htapi; + +import lombok.Data; + +import java.io.Serializable; +/** + * API 返回结果 + * @Author fxj + * @Date 2020-11-13 + * @return + **/ +@Data +public class ResultBean implements Serializable { + /** + * API返回结果 + **/ + private String ENCMSG; +} diff --git a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/vo/YifuUser.java b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/vo/YifuUser.java index a2d2bcae2d84b660ca0a18831cc7895968e64ca7..a361d75823975ba3bfe5a77219db6cf3cc606b64 100644 --- a/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/vo/YifuUser.java +++ b/yifu-common/yifu-common-core/src/main/java/com/yifu/cloud/plus/v1/yifu/common/core/vo/YifuUser.java @@ -17,10 +17,13 @@ package com.yifu.cloud.plus.v1.yifu.common.core.vo; import lombok.Getter; +import lombok.Setter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; import java.util.Collection; +import java.util.List; +import java.util.Map; /** * @author lengleng @@ -91,4 +94,11 @@ public class YifuUser extends User { this.ldapDn = ldapDn; } + /** + * key是客户端id,val是角色id数组 + */ + @Getter + @Setter + private Map<String, List<Integer>> clientRoleMap; + } diff --git a/yifu-common/yifu-common-security/src/main/java/com/yifu/cloud/plus/v1/yifu/common/security/component/YifuResourceServerConfigurerAdapter.java b/yifu-common/yifu-common-security/src/main/java/com/yifu/cloud/plus/v1/yifu/common/security/component/YifuResourceServerConfigurerAdapter.java index 71b952ad1fee1d2858238cf5085e2325ecc0c309..5ce18bc9dcb114f6d585595a767541eeb8b7f5ad 100644 --- a/yifu-common/yifu-common-security/src/main/java/com/yifu/cloud/plus/v1/yifu/common/security/component/YifuResourceServerConfigurerAdapter.java +++ b/yifu-common/yifu-common-security/src/main/java/com/yifu/cloud/plus/v1/yifu/common/security/component/YifuResourceServerConfigurerAdapter.java @@ -65,7 +65,7 @@ public class YifuResourceServerConfigurerAdapter extends ResourceServerConfigure permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); // “/user/getInfoByUsername" URL 访问放行 registry.and() - .authorizeRequests().antMatchers("/api/**","/api-docs/**").permitAll() + .authorizeRequests().antMatchers("/api/**","/api-docs/**","/**/getInfoByEmpPhone","/**/sendCCode","/**/employee/registration").permitAll() .anyRequest().authenticated().and().csrf().disable(); } diff --git a/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/entity/TStatisticsCurrentReport.java b/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/entity/TStatisticsCurrentReport.java index 37dbc621e2ca8905ed8f5101840737e5aea3d7cd..a3f6e28ee7c50f5fe76d989b0591cf1072fb201d 100644 --- a/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/entity/TStatisticsCurrentReport.java +++ b/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/entity/TStatisticsCurrentReport.java @@ -186,6 +186,11 @@ public class TStatisticsCurrentReport { @HeadFontStyle(fontHeightInPoints = 11) @ExcelProperty("累计3å²ä»¥ä¸‹å©´å¹¼å„¿ç…§æŠ¤") private BigDecimal sumBabyMoney; + + @ExcelAttribute(name = "累计个人养è€é‡‘", isFloat = true,max = "999999999.99") + @HeadFontStyle(fontHeightInPoints = 11) + @ExcelProperty(value = "累计个人养è€é‡‘") + private BigDecimal sumPrivatePension; /** * 是å¦å½“月新增人员 */ @@ -299,9 +304,4 @@ public class TStatisticsCurrentReport { @ExcelProperty("专项汇总") private BigDecimal specialDeduMoney; - @ExcelAttribute(name = "累计个人养è€é‡‘", isFloat = true,max = "999999999.99") - @HeadFontStyle(fontHeightInPoints = 11) - @ExcelProperty(value = "累计个人养è€é‡‘") - private BigDecimal sumPrivatePension; - } diff --git a/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/vo/TStatisticsCurrentReportMarketVo.java b/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/vo/TStatisticsCurrentReportMarketVo.java index d16e4ee80f0f6b6e07027a70eb511335f4779151..82c85e18e44130d22095ac3e54ce845be6d1f166 100644 --- a/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/vo/TStatisticsCurrentReportMarketVo.java +++ b/yifu-salary/yifu-salary-api/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/vo/TStatisticsCurrentReportMarketVo.java @@ -264,6 +264,11 @@ public class TStatisticsCurrentReportMarketVo implements Serializable { @HeadFontStyle(fontHeightInPoints = 11) @ExcelProperty("累计3å²ä»¥ä¸‹å©´å¹¼å„¿ç…§æŠ¤") private BigDecimal sumBabyMoney; + + @ExcelAttribute(name = "累计个人养è€é‡‘", isFloat = true,max = "999999999.99") + @HeadFontStyle(fontHeightInPoints = 11) + @ExcelProperty(value = "累计个人养è€é‡‘") + private BigDecimal sumPrivatePension; /** * 累计其他扣除 */ diff --git a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/SalaryUploadController.java b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/SalaryUploadController.java index a0d1dedf1b2fbd6c402ddd97dce98f38210404b2..1f76e9a147b23640428528ee93bea58a6793a4b3 100644 --- a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/SalaryUploadController.java +++ b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/SalaryUploadController.java @@ -47,7 +47,7 @@ public class SalaryUploadController { @Operation(description = "打开结算å•") @SysLog("打开结算å•") - @PostMapping("openBill") + @PostMapping("/openBill") public R<TSalaryDetailVo> openBill(@RequestParam String salaryFormId) { return salaryUploadService.getBill(salaryFormId); } diff --git a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/TSalaryAccountPhoneController.java b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/TSalaryAccountPhoneController.java index 92e4d098784245b6be2686185d389d8cb201a831..71c74c4dd411193aead0186f1fd00d90cdc3ee3f 100644 --- a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/TSalaryAccountPhoneController.java +++ b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/controller/TSalaryAccountPhoneController.java @@ -158,8 +158,8 @@ public class TSalaryAccountPhoneController { * @return */ @Operation(description = "æ ¹æ®æ‰‹æœºå·èŽ·å–员工信æ¯") - @GetMapping("/info/{empPhone}") - public R<TSalaryEmployee> getWxEmployeeInfo(@PathVariable String empPhone) { + @GetMapping("/getInfoByEmpPhone") + public R<TSalaryEmployee> getInfoByEmpPhone(@RequestParam String empPhone) { if (Common.isEmpty(empPhone)) { return R.failed("手机å·ä¸èƒ½ä¸ºç©º"); } diff --git a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/service/impl/SalaryUploadServiceImpl.java b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/service/impl/SalaryUploadServiceImpl.java index bf4005bb5c9f8efa666a3c4bef2c032f27f5174d..a8ad7f57f19843606910e45626693c13285453a2 100644 --- a/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/service/impl/SalaryUploadServiceImpl.java +++ b/yifu-salary/yifu-salary-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/salary/service/impl/SalaryUploadServiceImpl.java @@ -690,7 +690,7 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper, //ç´¯è®¡ä¸ªäººå…»è€ sdSum = sdSum.add(this.saveNewItems(saiList, SalaryConstants.SUM_PRIVATE_PENSION, SalaryConstants.SUM_PRIVATE_PENSION_JAVA, sds.getSumPrivatePension(), CommonConstants.ZERO_INT)); - a.setSumPrivatePension(sds.getSumBabyMoney()); + a.setSumPrivatePension(sds.getSumPrivatePension()); //ç´¯è®¡ä¸“é¡¹æ‰£é™¤æ€»é¢ this.saveNewItems(saiList, SalaryConstants.SPECIAL_DEDU_MONEY_SUM, SalaryConstants.SPECIAL_DEDU_MONEY_SUM_JAVA, sdSum, CommonConstants.ZERO_INT); diff --git a/yifu-salary/yifu-salary-biz/src/main/resources/mapper/TStatisticsCurrentReportMapper.xml b/yifu-salary/yifu-salary-biz/src/main/resources/mapper/TStatisticsCurrentReportMapper.xml index fa6b879f06da0741aec02a80beb72eaa24ec4f7c..95ccbaaea0c60f8a4da60d568782ec238b870b50 100644 --- a/yifu-salary/yifu-salary-biz/src/main/resources/mapper/TStatisticsCurrentReportMapper.xml +++ b/yifu-salary/yifu-salary-biz/src/main/resources/mapper/TStatisticsCurrentReportMapper.xml @@ -55,10 +55,10 @@ <result property="unitName" column="UNIT_NAME"/> <result property="specialDeduMoney" column="SPECIAL_DEDU_MONEY"/> <result property="sumBabyMoney" column="sum_baby_money"/> + <result property="sumPrivatePension" column="SUM_PRIVATE_PENSION"/> <result property="isNewEmployee" column="IS_NEW_EMPLOYEE"/> <result property="createMonth" column="CREATE_MONTH"/> <result property="empPhone" column="EMP_PHONE"/> - <result property="sumPrivatePension" column="SUM_PRIVATE_PENSION"/> </resultMap> <sql id="Base_Column_List"> a.id, @@ -92,10 +92,10 @@ a.UNIT_NAME, a.SPECIAL_DEDU_MONEY, a.sum_baby_money, + a.SUM_PRIVATE_PENSION, a.IS_NEW_EMPLOYEE, a.CREATE_MONTH, - a.EMP_PHONE, - a.SUM_PRIVATE_PENSION + a.EMP_PHONE </sql> <sql id="tStatisticsCurrentReport_where"> <if test="tStatisticsCurrentReport != null"> diff --git a/yifu-upms/yifu-upms-api/src/main/java/com/yifu.cloud.plus.v1/yifu/admin/api/dto/UserInfo.java b/yifu-upms/yifu-upms-api/src/main/java/com/yifu.cloud.plus.v1/yifu/admin/api/dto/UserInfo.java index ab1eddf1e7f6ebd97810f7071d55430e1fcf1b0e..2d2a42199c75093dad9bca9bf095f9c0ae986979 100644 --- a/yifu-upms/yifu-upms-api/src/main/java/com/yifu.cloud.plus.v1/yifu/admin/api/dto/UserInfo.java +++ b/yifu-upms/yifu-upms-api/src/main/java/com/yifu.cloud.plus.v1/yifu/admin/api/dto/UserInfo.java @@ -23,6 +23,7 @@ import lombok.Data; import java.io.Serializable; import java.util.List; +import java.util.Map; /** * @author lengleng @@ -44,6 +45,11 @@ public class UserInfo implements Serializable { */ private String[] permissions; + /** + * key是客户端id,val是角色id数组 + */ + private Map<String,List<Integer>> clientRoleMap; + /** * è§’è‰²é›†åˆ */ diff --git a/yifu-upms/yifu-upms-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/admin/controller/UserController.java b/yifu-upms/yifu-upms-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/admin/controller/UserController.java index 10dae0253a7a22874ff64988dbfa67fec8966b45..5b97e0730caa50c420b69958503c8a97a183207b 100644 --- a/yifu-upms/yifu-upms-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/admin/controller/UserController.java +++ b/yifu-upms/yifu-upms-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/admin/controller/UserController.java @@ -451,4 +451,21 @@ public class UserController { userService.saveCUser(employeeInfo.getEmpIdcard(), employeeInfo.getEmpName(), employeeInfo.getEmpPhone(), openId, headImgUrl); return R.ok(); } + + /** + * æ ¹æ®openid和类型获å–æŒ‡å®šç”¨æˆ·å…¨éƒ¨ä¿¡æ¯ + * + * @return ç”¨æˆ·ä¿¡æ¯ + */ + @Inner + @PostMapping("/inner/getSysUserByWxOpenId") + public UserInfo getSysUserByWxOpenId(@RequestBody SysUser users) { + SysUser user = userService.getOne(Wrappers.<SysUser>query() + .lambda().eq(SysUser::getWxOpenid, users.getWxOpenid()).last(CommonConstants.LAST_ONE_SQL)); + if (user == null) { + return null; + } + UserInfo info = userService.getUserInfo(user); + return info; + } }