IT小奋斗2021-01-13 21:48:33

Token,令牌,访问资源的凭证,每次访问带上这个令牌,就可识别出用户身份。

JWT (JsonWebToken),是实现token技术的一种解决方案,由三部分组成: header(头)、payload(载体)、signature(签名)。

1、头:HS384 HS512 RS256 RS384 RS512 ES256 ES384 ES512 PS256 PS384

2、载体:

iss:Issuer,发行者sub:Subject,主题aud:Audience,观众exp:Expiration time,过期时间nbf:Not beforeiat:Issued at,发行时间jti:JWT ID

3、签名

代码案例:importio.jsonwebtoken.Claims;importio.jsonwebtoken.CompressionCodecs;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importjavax.crypto.spec.SecretKeySpec;importjava.security.Key;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importjava.util.UUID;publicclassJJWTTokenApply{//使用的KeypublicstaticKeyKEY=newSecretKeySpec('密钥'.getBytes(),SignatureAlgorithm.HS512.getJcaName());/***@paramexpiration==>失效时间*@return*/publicstaticStringgenerateAccessToken(Stringsubject,MapclaimsMap,longexpiration){//生成TokenreturnJwts.builder().setClaims(claimsMap).setSubject(subject).setId(UUID.randomUUID().toString()).setIssuedAt(newDate()).setExpiration(newDate(System.currentTimeMillis()expiration*1000)).compressWith(CompressionCodecs.DEFLATE).signWith(SignatureAlgorithm.HS256,KEY).compact();}/***@paramtoken*@return*/publicstaticMapparseAccessToken(Stringtoken){MapclaimsMap=newHashMap(16);try{Claimsclaims=Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();//失效时间claimsMap.put('expiration',claims.getExpiration());//签发者claimsMap.put('created',claims.getIssuedAt());claimsMap.put('subject',claims.getSubject());claimsMap.put('user_id',claims.get('user_id'));claimsMap.put('user_info',claims.get('user_info'));claimsMap.put('user_roles',claims.get('user_roles'));}catch(Exceptione){e.printStackTrace();}returnclaimsMap;}publicstaticvoidmain(String[]args){//主题Stringsubject='zhangsan';//加密数据MapclaimsMap=newHashMap(16);claimsMap.put('user_id',123);claimsMap.put('user_info','用户信息');claimsMap.put('user_roles','用户角色');//失效期1天Stringtoken=generateAccessToken(subject,claimsMap,86400);System.out.println('accessToken='token);//解析tokenMapparseMap=parseAccessToken(token);System.out.println('主题='parseMap.get('subject'));System.out.println('user_id='parseMap.get('user_id'));System.out.println('user_info='parseMap.get('user_info'));System.out.println('user_roles='parseMap.get('user_roles'));DateexpirationDate=(Date)parseMap.get('expiration');System.out.println('是否失效='expirationDate.before(newDate()));System.out.println('失效日期='expirationDate);System.out.println('失效时间='(expirationDate.getTime()-System.currentTimeMillis()));}}

SpringBoot采用token方式实现认证

1、SpringSecurity的配置

public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { CustomAuthenticationProvider customAuthenticationProvider = new CustomAuthenticationProvider(userDetailsService); authenticationManagerBuilder.authenticationProvider(customAuthenticationProvider); }@Overrideprotected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable() .authorizeRequests() // 请求授权// 配置路径放行.antMatchers('/**').permitAll() .antMatchers(HttpMethod.GET, '/webSocket/**').permitAll()// swagger 文档.antMatchers('/swagger-ui.html').permitAll() .antMatchers('/swagger-resources/**').permitAll()// druid.antMatchers('/druid/**').permitAll()// 放行OPTIONS请求.antMatchers(HttpMethod.OPTIONS, '/**').permitAll()// 其他都需要验证.anyRequest().authenticated() .and() .addFilter(new JWTAuthenticationFilter(authenticationManager(), userDetailsService)) .addFilter(new JWTAuthorizationFilter(authenticationManager()))// 不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); }@BeanCorsConfigurationSource corsConfigurationSource() {final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration('/**', new CorsConfiguration().applyPermitDefaultValues());return source; }}

解析:部分代码没贴,实现的类重点包含:JWTAuthenticationFilter、JWTAuthorizationFilter、CustomAuthenticationProvider

2、登录认证的执行流程

3、代码实现部分publicclassCustomAuthenticationProviderimplementsAuthenticationProvider{privateUserDetailsServiceuserService;publicCustomAuthenticationProvider(UserDetailsServiceuserService){this.userService=userService;}@OverridepublicAuthenticationauthenticate(Authenticationauthentication)throwsAuthenticationException{Stringusername=authentication.getName();Stringpassword=authentication.getCredentials().toString();//验证用户和密码返回}@Overridepublicbooleansupports(Class>authentication){returnauthentication.equals(UsernamePasswordAuthenticationToken.class);}}

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {private AuthenticationManager authenticationManager;private UserDetailsService userDetailsService;private JwtUtils jwtUtils;public JWTAuthenticationFilter(AuthenticationManager authenticationManager, UserDetailsService userDetailsService) {this.authenticationManager = authenticationManager;this.userDetailsService = userDetailsService;// 精确指定认证地址super.setFilterProcessesUrl('/api/authen/login'); }@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { Authentication returnAuthentication = null;try { AuthenUser loginUser = new ObjectMapper().readValue(request.getInputStream(), AuthenUser.class); Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginUser.getUsername(), loginUser.getPassword(), new ArrayList<>()); returnAuthentication = authenticationManager.authenticate(authenticationToken);return returnAuthentication; } catch (IOException e) { e.printStackTrace(); }return null; }// 成功验证后调用该方法@Overrideprotected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authen) throws IOException, ServletException { String username = (String) authen.getPrincipal(); UserDetails userDetail = (UserDetails) userDetailsService.loadUserByUsername(username); String token = jwtUtils.generateAccessToken(userDetail); HashMap resultData = Maps.newHashMap(); resultData.put('token', token); resultData.put('userInfo', userDetail); resultData.put('headerName', JwtUtils.TOKEN_HEADER); resultData.put('prefix', JwtUtils.TOKEN_PREFIX); resultData.put('tokenExpiration', jwtUtils.getExpireTime(jwtUtils.getAccess_token_expiration())); String json = JSONObject.toJSONString(ServerResponse.createBySuccess(resultData)); response.setCharacterEncoding('UTF-8'); response.setContentType('application/json; charset=utf-8'); response.getWriter().write(json); }@Overrideprotected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {if (failed instanceof BadCredentialsException) { response.setCharacterEncoding('utf-8'); response.getWriter().write(JSONUtil.toJsonStr(ServerResponse.createDefaultErrorMessage(failed.getMessage()))); } else if (failed instanceof UsernameNotFoundException) { response.setCharacterEncoding('utf-8'); response.getWriter().write(JSONUtil.toJsonStr(ServerResponse.createDefaultErrorMessage(failed.getMessage()))); } else { response.getWriter().write('authentication failed, reason: ' failed.getMessage()); } }}

认证登录成功后,返回JSON串,包含token。

3、再次请求

4、代码处理部分publicclassJWTAuthorizationFilterextendsBasicAuthenticationFilter{publicJWTAuthorizationFilter(AuthenticationManagerauthenticationManager){super(authenticationManager);}@OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainchain)throwsIOException,ServletException{StringtokenHeader=request.getHeader('Authorization');//HTTP头中的Authorization信息if(tokenHeader==null||!tokenHeader.startsWith('Bearer')){chain.doFilter(request,response);return;}try{//解析token,并且设置认证信息SecurityContextHolder.getContext().setAuthentication(getAuthentication(tokenHeader));}catch(TokenIsExpiredExceptione){response.setCharacterEncoding('UTF-8');response.setContentType('application/json;charset=utf-8');response.setStatus(HttpServletResponse.SC_FORBIDDEN);Stringreason='错误:'e.getMessage();response.getWriter().write(newObjectMapper().writeValueAsString(reason));response.getWriter().flush();return;}super.doFilterInternal(request,response,chain);

java 用户登录token_Java,SpringBoot采用token方式实现登录认证相关推荐

  1. Token方式 验证登录

    Token 验证 在这之前先简单讲下登陆中验证码认证过程,先是在WebSecurityConfig里面配置下生成验证码的路径,使用谷歌的com.google.code.kaptcha API中的Pro ...

  2. java mirai-2.15 qq机器人扫码登录或springboot项目进行扫码登录

    请下载我的jar包在项目中引用 [java-mirai-qrcode-0.1.jar] jar包有参考 mirai-console-dev-qrlogin-0.1.7在java中整合 适应mirai版 ...

  3. 你真的了解单点登录(SSO)吗? 单点登录实现方式

    在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?单点登录(SSO)有什么用?下面就来详细介绍一下. 1 单点登录 1.1 什么是单点登录 单点登录的英文名叫做:Single ...

  4. 微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)

    微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现) 文章目录 微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现) 准备工作 开发思路 具体代 ...

  5. springboot实现几种常见登录(注册)方式

    一.用户注册(手机验证码) 目前主流采用手机号注册方式,因为收集到手机号对用户推广.业务推广有极其重要的价值.结合上篇采用阿里云短信服务实现手机验证码的发送,这里整合实现用手机号实现用户注册. 思路: ...

  6. Springboot实现登录拦截的三种方式

    文章目录 1. 登录认证 1.1 介绍 1.2 方式 1.3 扩展 2. 实现 2.1 项目结构以及前置准备 2.2 过滤器实现登录拦截 2.3 拦截器实现登录拦截 2.4 AOP+自定义注解实现 2 ...

  7. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...

  8. java token_Java实现基于token认证的方法示例

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  9. Java用户登录验证系统流程

    前言 本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现. 结合网关相关知识食用更佳 业务图解 对于用户 ...

最新文章

  1. java 初识对象和对象引用的关系
  2. ts引入公共方法_vue3+TS+ant2.0 实践指南
  3. python中国-一个身居中国的法国程序员谈Python与PHP
  4. StartService返回2的解决方法
  5. mysql的groupby原理是啥_mysql数据库groupby报错原理是什么?
  6. JAVA NIO知识点总结(2)——直接缓冲区和非直接缓冲区
  7. 代码编译 Compile、Make、Build 的区别
  8. 【转载 待读】卷积神经网络
  9. pytorch 复制、粘贴、替换Model某一层的训练参数
  10. hive元数据为什么要用mysql_Hive用MySQL做元数据保存的数据库时,mySQL设置
  11. python派落塔问题_浅析python递归函数和河内塔问题
  12. linux启动找不到,pxe启动的时候找不到pxelinux.0的原因
  13. linux 命令学习 —— 硬件外设管理(dmesg、lsusb)
  14. Android之WindowManager+OpenGL+EGL绘制(十七)
  15. java代码_【JAVA虚拟机(JVM)精髓】05-Java代码的执行过程
  16. Idea修改项目的包名
  17. 十年磨一剑!腾讯QQ Linux版 2.0.0 Beta重磅发布!
  18. 分享PMP真题回忆,出征软考高级项目管理师
  19. 无比强悍的CRM营销模块,SuiteCRM功能介绍
  20. win7与internet时间同步出错_电脑时间同步出错怎么办 win7/xp电脑时间同步出错解决方法...

热门文章

  1. 剑指Offer之栈的压入、弹出序列
  2. Redis【第二篇】集群搭建
  3. jquery判断多选框是否选中
  4. Cache模拟器(CacheSim)
  5. 12.委托是什么?委托的property声明用什么属性?为什么?
  6. 用Eclipse开发PHP项目
  7. Cortex-M家族发展史,简述Cortex-M0~M4的各个优势
  8. python的继承用法_Python 中的继承之Super用法
  9. php面向对象调用方法,在面向对象的php中调用方法
  10. java51游戏_简单实现美空军也得玩的游戏-谁能坚持超过50秒?(Java)