Springboot集成JWT實現(xiàn)登錄注冊的示例代碼
記錄一下使用Springboot集成JWT實現(xiàn)登錄注冊,以后有用到直接copy即可。
整體流程
依賴
<!--引入jwt--> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <!-- MD5加密依賴 --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>
工具類
import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; import com.huishi.entity.MapUser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import javax.servlet.http.HttpServletRequest; import java.util.Date; @Slf4j public class SecurityUtils { public static String md5(String src) { return DigestUtils.md5Hex(src); } //密鑰鹽 private static final String salt = "1a2b3c4d"; /** * 密碼加密 * @param inputPass * @return */ public static String inputPassToFormPass(String inputPass) { String str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4); System.out.println(str); return md5(str); } public static String formPassToDBPass(String formPass, String salt) { String str = "" + salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4); return md5(str); } public static String inputPassToDbPass(String inputPass, String saltDB) { String formPass = inputPassToFormPass(inputPass); String dbPass = formPassToDBPass(formPass, saltDB); return dbPass; } /** * 生成token * * @param mapUser * @param tokenExpireTime * @param tokenSecret * @return */ public static String genToken(MapUser mapUser, Integer tokenExpireTime, String tokenSecret) { Date expireAt = new Date(System.currentTimeMillis() + tokenExpireTime * 60 * 1000); return JWT.create() //發(fā)行人 .withIssuer("auth0") //存放數(shù)據(jù) .withClaim("userId", mapUser.getId()) .withClaim("username", mapUser.getUserName()) .withClaim("password", mapUser.getPassword()) //過期時間 .withExpiresAt(expireAt) .sign(Algorithm.HMAC256(tokenSecret)); } /** * 對token進(jìn)行驗證 * * @param token * @param tokenSecret * @return */ public static Boolean verifyToken(String token, String tokenSecret) { DecodedJWT decodedJWT = null; try { //創(chuàng)建token驗證器 JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(tokenSecret)).withIssuer("auth0").build(); decodedJWT = jwtVerifier.verify(token); log.info("token認(rèn)證通過,用戶:{},過期時間:{}", getUserName(token), decodedJWT.getExpiresAt()); } catch (IllegalArgumentException | JWTVerificationException e) { //拋出錯誤即為驗證不通過 log.error("token認(rèn)證失敗,用戶:{}", getUserName(token)); return false; } return true; } public static String getUserName(String token) { return JWT.decode(token).getClaims().get("username").asString(); } public static Long getUserId(String token) { if (token == null) return null; return JWT.decode(token).getClaims().get("userId").asLong(); } public static String getToken(HttpServletRequest request) { String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { return authHeader.replace("Bearer ", ""); } return null; } }
注冊和登錄
@Override public ResponseResult register(MapUser mapUser) { mapUser.setPassword(SecurityUtils.inputPassToFormPass(mapUser.getPassword())); return ResponseResult.success(mapUserMapper.insert(mapUser)); } @Override public ResponseResult login(MapUser mapUser) { String password = SecurityUtils.inputPassToFormPass(mapUser.getPassword()); MapUser user = mapUserMapper.findByName(mapUser.getUserName()); if (user == null) throw new ServiceException("用戶不存在"); if (!password.equals(user.getPassword())) throw new ServiceException("密碼錯誤"); String token = SecurityUtils.genToken(user, tokenExpireTime, tokenSecret); MapConfig mapConfig = mapConfigMapper.getByUserId(user.getId()); Map<String, Object> result = new HashMap<>(); result.put("token", token); result.put("mapConfig", mapConfig.conventEntity()); return ResponseResult.success(result); }
攔截器
import com.alibaba.fastjson.JSONObject; import com.huishi.util.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * token攔截器 */ @Component @Slf4j public class TokenInterceptor implements HandlerInterceptor { @Value("${token.header}") private String tokenHeader; @Value("${token.prefix}") private String tokenPrefix; @Value("${token.secret}") private String tokenSecret; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String authHeader = request.getHeader(tokenHeader); if (authHeader != null && authHeader.startsWith(tokenPrefix)) { String token = authHeader.replace(tokenPrefix + " ", ""); if (SecurityUtils.verifyToken(token, tokenSecret)) return true; } String requestURI = request.getRequestURI(); JSONObject json = new JSONObject(); json.put("msg", "請求:" + requestURI + ",認(rèn)證失敗,無法訪問資源"); json.put("code", "401"); response.setContentType("application/json;charset=UTF-8"); response.getWriter().append(json.toString()); return false; } }
配置攔截器
import com.huishi.server.interceptor.TokenInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") .excludePathPatterns("/map/user/register", "/map/user/login", "/map/plane/getNewest", "/map/plane/tracePlaneInfo", "/map/config/get/**", "/swagger-ui.html", "/webjars/**", "/swagger-resources/**"); } }
到此這篇關(guān)于Springboot集成JWT實現(xiàn)登錄注冊的示例代碼的文章就介紹到這了,更多相關(guān)Springboot JWT登錄注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java執(zhí)行shell并獲取shell輸出日志方式
這篇文章主要介紹了java執(zhí)行shell并獲取shell輸出日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04java后臺調(diào)用HttpURLConnection類模擬瀏覽器請求實例(可用于接口調(diào)用)
這篇文章主要介紹了java后臺調(diào)用HttpURLConnection類模擬瀏覽器請求實例,該實例可用于接口調(diào)用,具有一定的實用價值,需要的朋友可以參考下2014-10-10Java中關(guān)于MouseWheelListener的鼠標(biāo)滾輪事件詳解
這篇文章主要介紹了Java中關(guān)于MouseWheelListener的鼠標(biāo)滾輪事件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot整合SpringSecurity認(rèn)證與授權(quán)
在項目開發(fā)中,權(quán)限認(rèn)證是很重要的,尤其是一些管理類的系統(tǒng),對于權(quán)限要求更為嚴(yán)格,本文主要介紹了SpringBoot整合SpringSecurity認(rèn)證與授權(quán),感興趣的可以了解一下2023-11-11Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因為每次啟動Sentinel都會使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細(xì)了解可以參考下文2023-05-05JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù)
這篇文章主要為大家介紹了JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09使用lombok@Data存在extends時需要注意的問題
在Java編程中,正確實現(xiàn)equals方法是保證對象比較一致性的關(guān)鍵,使用instanceof檢查類型可能導(dǎo)致違反對稱性原則,即當(dāng)子類和父類都重寫equals時可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過callSuper=true參數(shù)2024-10-10