From 2aaba301d9f14569c1e7fd01e5c2c5bc4df2530f Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Wed, 24 Apr 2024 10:52:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=B0=E5=A2=9E):=20:rocket:=20?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- common/common-util/pom.xml | 16 +++--- .../com/atguigu/common/utlis/JwtHelper.java | 51 ++++++++++++++++++ .../com/atguigu/common/result/Result.class | Bin 6157 -> 6151 bytes .../common/result/ResultCodeEnum.class | Bin 1996 -> 2055 bytes common/pom.xml | 7 ++- .../java/com/atguigu/model/system/Login.java | 14 +++++ .../auth/controller/IndexController.java | 18 ++++--- .../atguigu/auth/service/SysUserService.java | 10 ++++ .../auth/service/impl/SysUserServiceImpl.java | 41 ++++++++++++++ 10 files changed, 140 insertions(+), 19 deletions(-) create mode 100644 common/common-util/src/main/java/com/atguigu/common/utlis/JwtHelper.java create mode 100644 model/src/main/java/com/atguigu/model/system/Login.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 79f13d2..9134c12 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/common/common-util/pom.xml b/common/common-util/pom.xml index 9d7061a..156fad3 100644 --- a/common/common-util/pom.xml +++ b/common/common-util/pom.xml @@ -19,12 +19,13 @@ - org.springframework.boot - spring-boot-starter-web + com.atguigu + model + 1.0-SNAPSHOT - io.jsonwebtoken - jjwt + org.springframework.boot + spring-boot-starter-web org.projectlombok @@ -35,10 +36,9 @@ fastjson - com.atguigu - model - 1.0-SNAPSHOT - compile + javax.xml.bind + jaxb-api + 2.1 diff --git a/common/common-util/src/main/java/com/atguigu/common/utlis/JwtHelper.java b/common/common-util/src/main/java/com/atguigu/common/utlis/JwtHelper.java new file mode 100644 index 0000000..7f3f888 --- /dev/null +++ b/common/common-util/src/main/java/com/atguigu/common/utlis/JwtHelper.java @@ -0,0 +1,51 @@ +package com.atguigu.common.utlis; + +import io.jsonwebtoken.*; +import org.springframework.util.StringUtils; + +import java.util.Date; + +public class JwtHelper { + private static final long tokenExpiration = 365L * 24 * 60 * 60 * 1000; + private static final String tokenSignKey = "guigu-OA"; + + public static String createToken(Long userId, String userName) { + return Jwts.builder() + .setSubject("OA-USER") + .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) + .claim("userId", userId) + .claim("userName", userName) + .signWith(SignatureAlgorithm.HS256, tokenSignKey) + .compressWith(CompressionCodecs.GZIP) + .compact(); + } + + public static Long getUserId(String token) { + if (StringUtils.isEmpty(token)) return null; + + Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + Claims claims = claimsJws.getBody(); + Integer userId = (Integer) claims.get("userId"); + return userId.longValue(); + // return 1L; + } + + public static String getUserName(String token) { + if (StringUtils.isEmpty(token)) return ""; + + Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + Claims claims = claimsJws.getBody(); + return (String) claims.get("userName"); + } + + public static void removeToken(String token) { + // jwttoken无需删除,客户端扔掉即可。 + } + + public static void main(String[] args) { + String token = JwtHelper.createToken(7L, "admin"); + System.out.println(token); + System.out.println(JwtHelper.getUserId(token)); + System.out.println(JwtHelper.getUserName(token)); + } +} \ No newline at end of file diff --git a/common/common-util/target/classes/com/atguigu/common/result/Result.class b/common/common-util/target/classes/com/atguigu/common/result/Result.class index c797a584a74059d165b3159bfb5e3dcc550fe267..0f9aaa39eefb94795c91c04ea91fafdab7ed2a86 100644 GIT binary patch literal 6151 zcmcIoTX!2*75+xjXvWSYv7I=nasj8fSeER%w4rHy$^B9j%L%sQ(hD@QJhheDQX-Gi zhEkxWG~B`+3Ow>aUh)7e;%3pcSnv{9{2m?)<=f|+k;bwdxh;4td(ND*&)(nO``h~* z&p-e3=f40rj9)v5S?DR0mxuDfLbbS19pZSoTpFtQE7hf7Xi7cWVIkqcM$$rZv{)(z z$1KFt{j;**dT2wt1!u(%&g6rh} zc?(ZBlbmP;XQUk+=ycHKVHb8=NVnQ>x;*cnEmfBZa={PeO+fZXP>z=Zf5ER%vxPk# z_Tmxkke1yOg&B&9M;+MbVLuL7Xs6ftl!C6ejOr%#`qp0l!X_YLEoTsB$CxI zn5|Juv_J3RX^D2?+{y8YHWJ|(4@WV~iGpIxu88K41R^%-VGJw?XF1G&S47fa5Wy23 zPT~~x&8sqrN|{Uu{mytei*u~2LcVnNdNseaNkP3J!kz6H#}^!2@Gv2pI_mMzDp|0; zC|MEdee&m`hfDY(;gYesUf0vL24x)69%gWvP!{tmi@Fq8_2Uknv#_^rNxOJTO4_fq zV-^V)FIez&^I&z(`(rZwl7}zjD@2sPcFixb{0E~MttD#{#bnkju80b@m~}f1;wXRC zK^k#UV9gEmm;{ZvV39flJ(35$ELgDmMSIc1RVijSC~E~0-Gqg<>Ec2uA5<&c7N40J zVG4CLc1{#a{$zD|&acem=a#tKHBm0)muB;oqP&~Qr0%8`9&OD;mcn`!H?M_i`daQD zCAedRw|zRu7hcWfuNeRxIX_q|&tJ+{^2>hUSJ((njm`{5Xli13EKLoqt30%mm@CiU z6sp!5?9%3HTcVekN}K)&02Ur%uFj*dS|k3}*w*Uo2wm-EPj4m5$RFPXQ0vX1p~-Yh zJ0BrXgjC!F(*M#-2>#he!O1Z)c4i<|n13TTX3OcEX zKg&)~=43fo^eNLOGQC1>whuLDUOcr>>-XFBTJ2r$(_P-|(=U&;jQMCr>es$BHJ&?5 zFykB>n{IDSzul|V4M(HBImsj83R@)|&2DY8^aDz#n`dLAYDQ|hT&)!Rb4BTg+w>vu zxD+D}@%S0%#WRkWoU9zh#mv(LXBv@k+tRf{?^;*C+LDv@JG`KB9_*I4QDTDAWib-%f1>xi% zk#!Fa5ZhoQwj7btFEh*mq1CG>YC9(leGr3^_;$?%!cfHj%J16P9{6h#A2W<>Kbrrjyg4-IfiF- zmqjYHO-_l+8#%RFKjBDY0eO+U+4vUQH&kQPWg{~IXDs<@&_vxxqq-eiRL6hmSlf;0jyJ07 z*pfQkncpTpeh4vYBjmb=BY&U|`cTsy)`>(pX}p$hC8vC}ZOEGVZ+h)f{@ZQICy{1G zMz(6Cu{Sjs8B<31jf#jRK(jPv`tCg(->MOPKanC2d$RUKyp(c}ToXD>Px&?{`CqyA z&6?q}joWW$GrxnKxSRbOtlz+n-_8CNR&Ic|nbYc(gY%O-ozD*^2LFz2sl)?x-hnrm zO0418P$D;MQzSQ>OxYrne1NVy*q*Xe$%xS8utTBAVK?Q7kZXjTlp6{q?h=r`K1K8R zk_KAK<88d7ZfD&*zi+7vNiT}{4(H;$AQbRjjuJReSHH)RjT}zk`y3@1h(q`RM-F%G z$8C<>$Ti`%VT0EDLk37LURijK`vG?F>h*8zalr2l<1UAf=wVxQ7!v6n<~SkWO?0qv zfuWZi+Y)7Qax=1qB`PpS5m2$CWmdc#4M^!Zpv0m2bw45m^Nq<6UP*OgdY=* z%}+YlIf{|w7w{AM5$Bh~C-GB`5GUB*B1N7K6;khg491 zkI6(g>`)+-NvxkTV#$bDU9xeO!UWFGEjpU)ANme=_ zj*qT+J)V^LS2$k7Vq=%n-AH%b!zNhu<5^~O54Q1h`YAo(by}Aj^6t!gcr}w{hszAy z!$@YZNr!M%uhSRf-9|fi)-Ei&&4oqgq-#Vk#v(7a_1ZGm%*9wbp){(K{MGIE7b>q( amg~DZ0XFumwk>t_m{I&oyi5Br{OZ3vx{nM1 literal 6157 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 diff --git a/common/common-util/target/classes/com/atguigu/common/result/ResultCodeEnum.class b/common/common-util/target/classes/com/atguigu/common/result/ResultCodeEnum.class index f4de3e5f7ee174819ec54e37bf421dc2ae3421f2..3ecfd459270a4529242ab55d60e408260fc0b988 100644 GIT binary patch literal 2055 zcmb7FOK%%h6#i~JwkOj`V>?Ys+EPLZU^}Fykn(a!_FAg%MO&8STe=HJ{>v(eMTaaO~w;TiA*M);Wztr^z$3-Ol%>x4f}Nj zB%Dg0P0lUF78lO3_5mG(5}r?FW|M}IOwTcVP{$(}Cc>lHSZXmrgvZYBow0_)IO4^y zjz@7+z@0Bv$`-{6hEkWz%Vwl#mJ5;e@+B)@k7^jf<6a!o@dQSR{k8%Zj~HAwiw!IN zzQD<#!#Z9xYqh8YFzQviT!=a&umkD;DIHHEDBzj2%XWQAV94pJW0?$PIrFfNF+4++ z&Qt#c1{@)h<+@d{s&llJ5qpJ`hzdk^+GJJqs-XNmTVLJ&^X^R*x{8>9 z-del5b>+s^cOPwSZmQ^4afZR`>#eI_cfo*)vjV-XwOfCz-ha6Isfs}rud!P5Mr-Z! z))yZ?T)oCTQ#xib$D<=VR}&ZyhW^L!5WB9S!golZKV_G#xkhQ(sxFwzMM9=_sX=J( z^U2MsgjGG-kU~w(|~k8cX|OGGFY>wksIQ z3QRiM&-Y+*@70;2A=8XXqnfv7Y_9ge&V_cIXL$MqwR(j1Vej-X?>2xWttcsJGf7E% zNJ?5fQqra&ivV9RDd`3QzC*lf=A5G!J9td zEqcaCJwi{8o*ukS{LbS7ea}l=NWSjyU4+)9!gc`$WW07l?oK>`cku2m#^e7qKJag2 zpT;-0V|-es2ZVi|?;&!oCR|2NY0_U<&fTQ>$a$Ld=acg`;WKh-69WcE*x4TyOL(v2 zZ=+L=PwtbqzzLThKW^f=z>D|r@*TJ&IH~yY6N9fx&?~`HZol_;2B#&cN$|ACk6##! zOR!IZ39lc&GB_hap9IgTe*DH@Qi21Uc>NBBxQlJ7M``Rp{Trmg2%`_Du%AZ52b=o& Q0aR*8yDcV`W%cua1Je1=?*IS* literal 1996 zcmb7F-)~b@9RJ+yw)eKX8*TRkhGUK~r0awVg1=VhO6j25t+RKVR?vCZUCSlyZPMQI zXpAOCNl19{Vabdk(HBe%6p%&K@TkTIeb(1i`6rCu@3}2>xER*tobNfG^Zohxo^$)l zKi~Zb;5b%%ka5b7BxV#u6rA>BAI|WU;*(c-dQHW!A8E|0nDf&pXdq(3`$sTr{FZ!!ATqwqq8|3b|HFX0>V*=seVRt~(XWF7WZ# zQartwq=YBV?j&RHMWa|Vs}c@}$9H5XbJ-Ghr7hc>tCd#F%7U>{Bt#J&Gw(^53ja6L z@tq_WN|*CSamlDy?7Hb+wv7^n3Cx<#`SR+#QK7A4R;UDT%(5+KO2Xtefm3a{v{-F} znnaE-Q5&4|7J2iJnbg!VH(Iy5DOXl4+bBx#=~lruoLYr43Aac4f7eREbX?y0!{cqy zTUHd6G-g|!?%SgDpx0_FUu;&|8Rm>*ZLatx#vY&KDY`p;yj6iM*pi)EV%-b!+2<${@ah?EoUT}>2?YIU-W<<@m+gPNa! zfp)v5T8f(#e3(G9-4X`EsqL=8^ilc{?W511Z+ei40Z0-hLJ|!^Qt3ic#X?e*WD#Pb zg(R+lz+P@0?Y;0}0#Ab;I_*YD^3Pv~^esB>q4PTJBpjjHE6!BXkK!402>s(E*}@-^ zBOCDCgUtFJTl9|-qPbc)#cw+P`(ZI z2BEIg5D@?jP%^vGg*^yj5FB8HY`MtiM6s=MU5pEsMbMy(=L5hCG!BybAsR2z=)g;q z-y~u*GYe6YT$Lws3(BJf^@@0IL7rwj2`^)68)NlR2JtI{{Q?{i;BF;|-x%B@ zz(E1-RfG7Q!6yVb6!88)@jL7Ehn17-2S9SU><4b?JSmM6*kF94ASy1BrhDs 4.0.0 @@ -21,6 +21,9 @@ - + + io.jsonwebtoken + jjwt + diff --git a/model/src/main/java/com/atguigu/model/system/Login.java b/model/src/main/java/com/atguigu/model/system/Login.java new file mode 100644 index 0000000..2c4a60c --- /dev/null +++ b/model/src/main/java/com/atguigu/model/system/Login.java @@ -0,0 +1,14 @@ +package com.atguigu.model.system; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Login { + private String token; +} diff --git a/service-oa/src/main/java/com/atguigu/auth/controller/IndexController.java b/service-oa/src/main/java/com/atguigu/auth/controller/IndexController.java index 3384d05..8e3d720 100644 --- a/service-oa/src/main/java/com/atguigu/auth/controller/IndexController.java +++ b/service-oa/src/main/java/com/atguigu/auth/controller/IndexController.java @@ -1,12 +1,13 @@ package com.atguigu.auth.controller; +import com.atguigu.auth.service.SysUserService; import com.atguigu.common.result.Result; +import com.atguigu.model.system.Login; +import com.atguigu.vo.system.LoginVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @@ -20,13 +21,14 @@ import java.util.Map; @RestController @RequestMapping("/admin/system/index") public class IndexController { + @Autowired + private SysUserService sysUserService; @Operation(summary = "登录", description = "登录") @PostMapping("login") - public Result> login() { - Map map = new HashMap<>(); - map.put("token", "admin"); - return Result.success(map); + public Result login(@RequestBody LoginVo loginVo) { + Login login = sysUserService.login(loginVo); + return Result.success(login); } @Operation(summary = "获取用户信息", description = "获取用户信息") diff --git a/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java b/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java index 5146d21..1e1d79c 100644 --- a/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java +++ b/service-oa/src/main/java/com/atguigu/auth/service/SysUserService.java @@ -1,6 +1,8 @@ package com.atguigu.auth.service; +import com.atguigu.model.system.Login; import com.atguigu.model.system.SysUser; +import com.atguigu.vo.system.LoginVo; import com.atguigu.vo.system.SysUserQueryVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -32,4 +34,12 @@ public interface SysUserService extends IService { * @param status 修改的状态 */ void updateStatus(Long id, Long status); + + /** + * 登录 + * + * @param vo 登录条件 + * @return 返回token + */ + Login login(LoginVo vo); } diff --git a/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java b/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java index 2fab02e..503fc43 100644 --- a/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java +++ b/service-oa/src/main/java/com/atguigu/auth/service/impl/SysUserServiceImpl.java @@ -2,13 +2,19 @@ package com.atguigu.auth.service.impl; import com.atguigu.auth.mapper.SysUserMapper; import com.atguigu.auth.service.SysUserService; +import com.atguigu.common.utlis.JwtHelper; +import com.atguigu.constant.MessageConstant; +import com.atguigu.exception.BunnyException; +import com.atguigu.model.system.Login; import com.atguigu.model.system.SysUser; +import com.atguigu.vo.system.LoginVo; import com.atguigu.vo.system.SysUserQueryVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; import org.springframework.util.StringUtils; /** @@ -66,4 +72,39 @@ public class SysUserServiceImpl extends ServiceImpl impl // 更新用户状态 updateById(sysUser); } + + /** + * 登录 + * + * @param vo 登录条件 + * @return 返回token + */ + @Override + public Login login(LoginVo vo) { + String username = vo.getUsername(); + String password = vo.getPassword(); + // 查询用户信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getUsername, username); + SysUser sysUser = getOne(wrapper); + + // 用户是否存在 + if (sysUser == null) { + throw new BunnyException(MessageConstant.ACCOUNT_NOT_FOUND); + } + + // 判断是否被禁用 + if (sysUser.getStatus() == 0) { + throw new BunnyException(MessageConstant.ACCOUNT_LOCKED); + } + + // 判断密码 + String md5DigestAsHexPassword = DigestUtils.md5DigestAsHex(password.getBytes()); + if (!md5DigestAsHexPassword.equals(password)) { + throw new BunnyException(MessageConstant.PASSWORD_ERROR); + } + // 添加token + String token = JwtHelper.createToken(sysUser.getId(), sysUser.getUsername()); + return Login.builder().token(token).build(); + } }