From 1e4d0abd3ad800a02c6bbb0050499aec1ebc0c53 Mon Sep 17 00:00:00 2001 From: FalingCliff Date: Sat, 24 May 2025 23:22:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E6=B7=BB=E5=8A=A0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD-=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=92=8C=E6=8E=A5=E5=8F=A3=20-=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=AC=E8=8E=B7=E5=8F=96=20openid=20?= =?UTF-8?q?=E5=92=8C=20session=5Fkey-=20=E6=9B=B4=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=85=81=E8=AE=B8=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E8=AF=B7=E6=B1=82=E9=80=9A=E8=BF=87?= =?UTF-8?q?=20-=20=E6=B7=BB=E5=8A=A0=E5=BF=85=E8=A6=81=E7=9A=84=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=92=8C=E6=95=B0=E6=8D=AE=E4=BC=A0=E8=BE=93=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ++ .../admin_server/config/SecurityConfig.java | 3 +- .../example/admin_server/config/WxConfig.java | 15 +++++ .../controller/client/WxLoginController.java | 64 +++++++++++++++++++ .../filter/JwtAuthenticationFilter.java | 1 + .../admin_server/model/dto/WxLoginDTO.java | 12 ++++ src/main/resources/application-dev.yml | 24 ++----- src/main/resources/application-prop.yml | 24 ++----- src/main/resources/application-test.yml | 24 ++----- src/main/resources/application.yml | 26 ++------ 10 files changed, 116 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/example/admin_server/config/WxConfig.java create mode 100644 src/main/java/com/example/admin_server/controller/client/WxLoginController.java create mode 100644 src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java diff --git a/pom.xml b/pom.xml index d385a47..b482ee3 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,11 @@ spring-security-test test + + com.alibaba + fastjson + 1.2.83 + diff --git a/src/main/java/com/example/admin_server/config/SecurityConfig.java b/src/main/java/com/example/admin_server/config/SecurityConfig.java index 6068a2f..5f01e7b 100644 --- a/src/main/java/com/example/admin_server/config/SecurityConfig.java +++ b/src/main/java/com/example/admin_server/config/SecurityConfig.java @@ -38,7 +38,8 @@ public class SecurityConfig { "/swagger-ui/**", "/v3/api-docs/**", "/api/public/**", - "/api/admin/login" + "/api/admin/login", + "/api/client/wx/login" ).permitAll() .antMatchers("/api/admin/**").authenticated() .antMatchers("/api/client/**").authenticated() diff --git a/src/main/java/com/example/admin_server/config/WxConfig.java b/src/main/java/com/example/admin_server/config/WxConfig.java new file mode 100644 index 0000000..4afb85a --- /dev/null +++ b/src/main/java/com/example/admin_server/config/WxConfig.java @@ -0,0 +1,15 @@ +package com.example.admin_server.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "wx") +@Data +public class WxConfig { + private String appid; + private String secret; + private String jscode2sessionUrl; +} + diff --git a/src/main/java/com/example/admin_server/controller/client/WxLoginController.java b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java new file mode 100644 index 0000000..ee2add5 --- /dev/null +++ b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java @@ -0,0 +1,64 @@ +package com.example.admin_server.controller.client; + +import com.alibaba.fastjson.JSONObject; +import com.example.admin_server.common.Result; +import com.example.admin_server.config.WxConfig; +import com.example.admin_server.model.dto.WxLoginDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/api/client/wx") +@RequiredArgsConstructor +@Api(tags = {"微信登录"}) +public class WxLoginController { + + private final WxConfig wxConfig; + + @PostMapping("/login") + @ApiOperation(value = "微信登录") + public Result wxLogin(@RequestBody WxLoginDTO request) { + String code = request.getCode(); + if (code == null || code.isEmpty()) { + return Result.fail("code 参数不能为空"); + } + + // 构造请求微信的 URL + String url = wxConfig.getJscode2sessionUrl() + + "?appid=" + wxConfig.getAppid() + + "&secret=" + wxConfig.getSecret() + + "&js_code=" + code + + "&grant_type=authorization_code"; + + // 请求微信服务器 + RestTemplate restTemplate = new RestTemplate(); + String response = restTemplate.getForObject(url, String.class); + + // 解析微信响应 + JSONObject jsonObject = JSONObject.parseObject(response); + String openid = jsonObject.getString("openid"); + String sessionKey = jsonObject.getString("session_key"); + + if (openid == null) { + String errMsg = jsonObject.getString("errmsg"); + return Result.fail("微信登录失败: " + errMsg); + } + + // TODO: 你可以在这里用 openid 查数据库,创建或更新用户,生成 JWT 等 + + Map resultData = new HashMap<>(); + resultData.put("openid", openid); + resultData.put("token", "mock-token-" + openid); // 后期你可以用 JWT 替换这里 + + return Result.ok("登录成功", resultData); + } +} diff --git a/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java index 95c6a8b..3379460 100644 --- a/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/admin_server/filter/JwtAuthenticationFilter.java @@ -29,6 +29,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { WHITELIST.add("/api/admin/login"); WHITELIST.add("/api/client/login"); WHITELIST.add("/api/employee/login"); + WHITELIST.add("/api/client/wx/login"); // 也可以放其它公开接口 } diff --git a/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java b/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java new file mode 100644 index 0000000..83a8d7f --- /dev/null +++ b/src/main/java/com/example/admin_server/model/dto/WxLoginDTO.java @@ -0,0 +1,12 @@ +package com.example.admin_server.model.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class WxLoginDTO { + + @NotBlank + private String code; +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 58bf9eb..5c31755 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -21,27 +21,11 @@ app: jwt: secret: 's9TfkPeAKJOlDw4ox3r6VhAMG7KfI0RK' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee +wx: + appid: wxf204145820676bb2 + secret: 642108612e162db4edb9cf01d7f6d474 + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application-prop.yml b/src/main/resources/application-prop.yml index 7772ee4..b210cf3 100644 --- a/src/main/resources/application-prop.yml +++ b/src/main/resources/application-prop.yml @@ -21,27 +21,11 @@ app: jwt: secret: '2n9g8b5TfsYLBZGFwE5ImpeQH5u0djEl' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 4e6fafa..085a18d 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -21,27 +21,11 @@ app: jwt: secret: 'ylZS9cQ40nBvcZxJKu9zCIDt096BpZbm' expiration: 86400000 - -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session knife4j: enable: true - setting: - language: zh_cn diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 07b0308..f1548ac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ spring: time-zone: GMT+8 # 指定当前激活环境 profiles: - active: test + active: dev datasource: url: jdbc:mysql://localhost:3306/admin_server?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai username: admin_server @@ -24,28 +24,12 @@ app: jwt: secret: 'mwsK9Ol9Ni2IyTvcdgFDVBxatw8QWx2o' expiration: 86400000 + wx: + appid: your_app_id + secret: your_app_secret + jscode2session-url: https://api.weixin.qq.com/sns/jscode2session -springdoc: - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha - api-docs: - path: /v3/api-docs - group-configs: - - group: '管理端' - paths-to-match: '/api/admin/**' - packages-to-scan: com.example.admin_server.controller.admin - - group: '客户端' - paths-to-match: '/api/client/**' - packages-to-scan: com.example.admin_server.controller.client - - group: '员工端' - paths-to-match: '/api/employee/**' - packages-to-scan: com.example.admin_server.controller.employee - knife4j: enable: true - setting: - language: zh_cn