SpringBoot整合token實現(xiàn)登錄認證的示例代碼
更新時間:2022年07月07日 11:00:38 作者:小浪餓了嗎***
本文主要介紹了SpringBoot整合token實現(xiàn)登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
1.pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> </dependency> </dependencies>
2.實體類
@Data public class User { private String id; private String username; private String password; }
3.Mapper接口
/** * @author qiaoyn * @date 2019/06/14 */ @Mapper public interface UserMapper { User findByUsername(String username); User findUserById(String id); }
4.service層
@Service public class UserService { @Autowired private UserMapper userMapper; public User findByUsername(User user){ return userMapper.findByUsername(user.getUsername()); } public User findUserById(String userId) { return userMapper.findUserById(userId); } }
/*** * token 下發(fā) * @Title: TokenService.java * @author qiaoyn * @date 2019/06/14 * @version V1.0 */ @Service public class TokenService { public String getToken(User user) { Date start = new Date(); long currentTime = System.currentTimeMillis() + 60* 60 * 1000;//一小時有效時間 Date end = new Date(currentTime); String token = ""; token = JWT.create().withAudience(user.getId()).withIssuedAt(start).withExpiresAt(end) .sign(Algorithm.HMAC256(user.getPassword())); return token; } }
5.Api層
@RestController public class UserApi { @Autowired UserService userService; @Autowired TokenService tokenService; // 登錄 @ApiOperation(value = "登陸", notes = "登陸") @RequestMapping(value = "/login" ,method = RequestMethod.GET) public Object login(User user, HttpServletResponse response) { JSONObject jsonObject = new JSONObject(); User userForBase = new User(); userForBase.setId(userService.findByUsername(user).getId()); userForBase.setUsername(userService.findByUsername(user).getUsername()); userForBase.setPassword(userService.findByUsername(user).getPassword()); if (!userForBase.getPassword().equals(user.getPassword())) { jsonObject.put("message", "登錄失敗,密碼錯誤"); return jsonObject; } else { String token = tokenService.getToken(userForBase); jsonObject.put("token", token); Cookie cookie = new Cookie("token", token); cookie.setPath("/"); response.addCookie(cookie); return jsonObject; } } /*** * 這個請求需要驗證token才能訪問 * * @author: qiaoyn * @date 2019/06/14 * @return String 返回類型 */ @UserLoginToken @ApiOperation(value = "獲取信息", notes = "獲取信息") @RequestMapping(value = "/getMessage" ,method = RequestMethod.GET) public String getMessage() { // 取出token中帶的用戶id 進行操作 System.out.println(TokenUtil.getTokenUserId()); return "您已通過驗證"; } }
6.util
/* * @author qiaoyn * @date 2019/06/14 * @version 1.0 */ public class TokenUtil { public static String getTokenUserId() { String token = getRequest().getHeader("token");// 從 http 請求頭中取出 token String userId = JWT.decode(token).getAudience().get(0); return userId; } /** * 獲取request * * @return */ public static HttpServletRequest getRequest() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); return requestAttributes == null ? null : requestAttributes.getRequest(); } }
7.Interceptor
/** * 攔截器 * @author qiaoyn * @date 2019/06/14 */ public class AuthenticationInterceptor implements HandlerInterceptor { @Autowired UserService userService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception { String token = httpServletRequest.getHeader("token");// 從 http 請求頭中取出 token // 如果不是映射到方法直接通過 if(!(object instanceof HandlerMethod)){ return true; } HandlerMethod handlerMethod=(HandlerMethod)object; Method method=handlerMethod.getMethod(); //檢查是否有passtoken注釋,有則跳過認證 if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //檢查有沒有需要用戶權限的注解 if (method.isAnnotationPresent(UserLoginToken.class)) { UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class); if (userLoginToken.required()) { // 執(zhí)行認證 if (token == null) { throw new RuntimeException("無token,請重新登錄"); } // 獲取 token 中的 user id String userId; try { userId = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new RuntimeException("401"); } User user = userService.findUserById(userId); if (user == null) { throw new RuntimeException("用戶不存在,請重新登錄"); } // 驗證 token JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build(); try { jwtVerifier.verify(token); } catch (JWTVerificationException e) { throw new RuntimeException("401"); } return true; } } return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
8.cofig
/*** * 新建Token攔截器 * @Title: InterceptorConfig.java * @author qiaoyn * @date 2019/06/14 * @version V1.0 */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns("/**"); // 攔截所有請求,通過判斷是否有 @LoginRequired 注解 決定是否需要登錄 } @Bean public AuthenticationInterceptor authenticationInterceptor() { return new AuthenticationInterceptor(); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) { // TODO Auto-generated method stub } @Override public void addCorsMappings(CorsRegistry arg0) { // TODO Auto-generated method stub } @Override public void addFormatters(FormatterRegistry arg0) { // TODO Auto-generated method stub } @Override public void addResourceHandlers(ResourceHandlerRegistry arg0) { // TODO Auto-generated method stub } @Override public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) { // TODO Auto-generated method stub } @Override public void addViewControllers(ViewControllerRegistry arg0) { // TODO Auto-generated method stub } @Override public void configureAsyncSupport(AsyncSupportConfigurer arg0) { // TODO Auto-generated method stub } @Override public void configureContentNegotiation(ContentNegotiationConfigurer arg0) { // TODO Auto-generated method stub } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer arg0) { // TODO Auto-generated method stub } @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> arg0) { // TODO Auto-generated method stub } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> arg0) { // TODO Auto-generated method stub } @Override public void configurePathMatch(PathMatchConfigurer arg0) { // TODO Auto-generated method stub } @Override public void configureViewResolvers(ViewResolverRegistry arg0) { // TODO Auto-generated method stub } @Override public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> arg0) { // TODO Auto-generated method stub } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> arg0) { // TODO Auto-generated method stub } @Override public MessageCodesResolver getMessageCodesResolver() { // TODO Auto-generated method stub return null; } @Override public Validator getValidator() { // TODO Auto-generated method stub return null; } }
9.annotation
/*** * 用來跳過驗證的 PassToken * @author qiaoyn * @date 2019/06/14 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface PassToken { boolean required() default true; }
/** * 用于登錄后才能操作的token * @author qiaoyn * @date 2019/06/14 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UserLoginToken { boolean required() default true; } /*RetentionPolicy.RUNTIME:這種類型的Annotations將被JVM保留, 所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用。*/
10.mapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.example.demo.mapper.UserMapper"> <select id="findByUsername" resultType="com.example.demo.entity.User"> SELECT id,password FROM user WHERE username=#{username} </select> <select id="findUserById" resultType="com.example.demo.entity.User"> SELECT username,password FROM user WHERE id=#{id} </select> </mapper>
11.測試
數(shù)據(jù)庫文件如下所示
到此這篇關于SpringBoot整合token實現(xiàn)登錄認證的示例代碼的文章就介紹到這了,更多相關SpringBoot token登錄認證內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- 基于SpringBoot整合oauth2實現(xiàn)token認證
- springboot+jwt實現(xiàn)token登陸權限認證的實現(xiàn)
- SpringBoot和Redis實現(xiàn)Token權限認證的實例講解
- SpringBoot整合Sa-Token實現(xiàn)登錄認證的示例代碼
- SpringBoot使用Sa-Token實現(xiàn)登錄認證
- SpringBoot使用Sa-Token實現(xiàn)權限認證
- 在SpringBoot中使用jwt實現(xiàn)token身份認證的實例代碼
- Springboot微服務分布式框架Rouyi Cloud權限認證(登錄流程之token解析)
- Springboot 如何使用 SaToken 進行登錄認證、權限管理及路由規(guī)則接口攔截
- springBoot整合jwt實現(xiàn)token令牌認證的示例代碼
相關文章
java中JSONObject轉換為HashMap(方法+main方法調用實例)
這篇文章主要介紹了java中JSONObject轉換為HashMap(方法+main方法調用實例),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11Spring?循環(huán)依賴之AOP實現(xiàn)詳情
這篇文章主要介紹了Spring?循環(huán)依賴之AOP實現(xiàn)詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的盆友可以參考一下2022-07-07