springboot+jwt做api的token认证,springboot生成token方法

  springboot+jwt做api的token认证,springboot生成token方法

  

1.pom.xml

dependencies dependencygroupidorg。spring框架。boot/groupid artifactId spring-boot-starter-web/artifactId/dependencydependencycgroupidorg。spring框架。boot/groupid artifactidspring-boot-test/artifactIdscopetest/scope/scope/dependency依赖关系groupidcom。auth 0/groupId artifact id Java-jwt/artifact id版本3。4 .0/版本/依赖项依赖关系groupId MySQL/groupId artifact id MySQL私有字符串用户名;私有字符串密码;}

2.实体类

/* * * * @作者qiaoyn * @ date 2019/06/14 */@ mapper公共接口用户映射器{ User findby username(字符串用户名);用户findUserById(字符串id);}

3.Mapper接口

@Ser

 

  vicepublic 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 下发* @Title: TokenService.java * @author qiaoyn* @date 2019/06/14* @version V1.0 */@Servicepublic 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层

@RestControllerpublic class UserApi {@AutowiredUserService userService;@AutowiredTokenService 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 请求头中取出 tokenString 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()) { // 执行认证 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 */@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns("/**"); // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录 } @Bean public AuthenticationInterceptor authenticationInterceptor() { return new AuthenticationInterceptor(); }@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) {// TODO Auto-generated method stub}@Overridepublic void addCorsMappings(CorsRegistry arg0) {// TODO Auto-generated method stub}@Overridepublic void addFormatters(FormatterRegistry arg0) {// TODO Auto-generated method stub}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry arg0) {// TODO Auto-generated method stub}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) {// TODO Auto-generated method stub}@Overridepublic void addViewControllers(ViewControllerRegistry arg0) {// TODO Auto-generated method stub}@Overridepublic void configureAsyncSupport(AsyncSupportConfigurer arg0) {// TODO Auto-generated method stub}@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer arg0) {// TODO Auto-generated method stub}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer arg0) {// TODO Auto-generated method stub}@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> arg0) {// TODO Auto-generated method stub}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> arg0) {// TODO Auto-generated method stub}@Overridepublic void configurePathMatch(PathMatchConfigurer arg0) {// TODO Auto-generated method stub}@Overridepublic void configureViewResolvers(ViewResolverRegistry arg0) {// TODO Auto-generated method stub}@Overridepublic void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> arg0) {// TODO Auto-generated method stub}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> arg0) {// TODO Auto-generated method stub}@Overridepublic MessageCodesResolver getMessageCodesResolver() {// TODO Auto-generated method stubreturn null;}@Overridepublic Validator getValidator() {// TODO Auto-generated method stubreturn 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.测试

 

  

 

  

 

  数据库文件如下所示

  

 

  到此这篇关于SpringBoot整合token实现登录认证的示例代码的文章就介绍到这了,更多相关SpringBoot token登录认证内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: