shiro 集成 JWT 自动获取token对应的用户信息

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.util.ThreadContext;
import org.apache.shiro.web.subject.WebSubject;
import org.apache.shiro.web.subject.WebSubject.Builder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.filter.OncePerRequestFilter;

import net.shopxx.entity.User;
import net.shopxx.service.UserService;

/**
 * 过滤请求头部信息,如果有,就自动登录
 * http://blog.csdn.net/qi923701/article/details/75007813
 * @author wutao
 * @date    2017年11月11日 下午3:09:51
 */
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class);

    @Autowired
    private UserService userService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        String tokenHeader = request.getHeader(JwtTokenUtil.AUTH_TOKEN);//从头部获取JWT字符串信息
        if(logger.isDebugEnabled()) {
            logger.debug("=========>tokenHeader {}", tokenHeader);
        }
        if(StringUtils.isNotBlank(tokenHeader)) {
            Long userId = JwtTokenUtil.getUserIdFromToken(tokenHeader);//解码JWT,获得userid
            if(userId!=null) {
                if (logger.isDebugEnabled()) {
                    logger.debug("getUserIdFromToken userId {}", userId);
                }

                User auser=userService.find(userId);//根据userID获取用户信息
                if(auser!=null) {
                    PrincipalCollection principals = new SimplePrincipalCollection(auser, "authorizingRealm");//拼装shiro用户信息
                    Builder builder = new WebSubject.Builder(request, response);
                    builder.principals(principals);
                    builder.authenticated(true);
                    WebSubject subject = builder.buildWebSubject();
                    ThreadContext.bind(subject);//塞入容器,统一调用
                }

            }
        }
        chain.doFilter(request, response);
    }

}
    public  @ResponseBody Map<String ,Object> complete(@CurrentUser User auser){

        if(auser==null) {
            logger.debug("=======auser==null======");
            return null;
        }

        Long userId=auser.getId();
        logger.debug("======userId {}=====",userId);

}
时间: 2024-10-10 04:58:16

shiro 集成 JWT 自动获取token对应的用户信息的相关文章

.net自动获取token,

 .NET自动获取Token, 我就直接上图片了,后面是完整代码,可以复制到你的项目, 我这个方法有点笨,但是没有任何问题 --------------------------------------------------------------从下方开始复制------------------------------------------------------ using System; using System.Collections.Generic; using System.IO;

UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息

应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Github: https://github.com/validvoid/UWP-SystemInfoCollector 由于涉及内容较多,故本文会分为多篇展开.本篇介绍获取设备和系统的基本信息.应用包信息.用户数据账户信息和用户账户信息. 原博客阅读地址:http://validvoid.net/uwp-

java以及C#获取AD域上用户信息

JAVA /** *  JAVA 读取AD用户信息 *  aa00a00 */package com.wanda.sso.client.servlet; import java.util.Hashtable; import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.directory.Attribute;imp

Django2集成xadmin详解-5-获取登录用户信息并填充相应Model字段

一 场景问题继续使用IDC Model,在此Model增加user字段,用于记录添加当前数据的用户: class IDC(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False, null=True) # 记录创建该数据的用户 name = models.CharField(max_length=64) contact = models.CharField(max_length=

postman自动获取token依赖

1.打开postman,点击Manage Environments-->Add-->添加一个环境,设置一个token变量,不输入值    2.新增一个可以返回token的接口,environment选中刚才创建的test 3. 切换到tests的面板中,写入代码 ,运行一下 状态为pass , 此时test中的token参数已经自动获取到接口返回的token值了 var data=JSON.parse(responseBody);if(data.data.token){ tests["

java微信授权获取OPENID,ACCESS_TOKEN,用户信息

获取微信的openId流程 1.获取微信code 使用接口 : appId 是当前开发者的appId 不是用户的  path  是回调地址 这个链接是授权链接,当重定向这个链接的时候,会展示授权页,点击授权之后 跳入你path的请求接口    回调中带了一个参数code获取到就行 https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+path+"&

用户研究如何获取更为真实的用户信息

本文来自网易云社区 作者:任琼瑶 从最常用的访谈法.测试法.问卷法到针对性较强的卡片分类.情绪板.体验地图等方法, 用户研究的方法非常多样化.尽管有这么多专业的研究方法,获取全面.真实的用户信息仍然是一件非常有难度的事情. 首先,面对众多的研究方法,要针对性的选择.巧妙的搭配已有研究方法.研究方法之众,也从侧面反映了一个问题--每一种方法,都存在一定的缺陷.尽管如此,但通过针对性的选择.巧妙的搭配,可以一定程度上减少用户信息获取偏差. 另外,随着行业的发展,需要通过方法创新应对特殊的调研需求.当

阿里云自动获取token值(python)

一,token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码. 简单token的组成:uid(用户唯一的身份标识).time(当前时间的时间戳).sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串.为防止token泄露). 原文地址:https://www.cnblogs.com/Mu

阶段3 1.Mybatis_09.Mybatis的多表操作_8 mybatis多对多操作-查询角色获取角色下所属用户信息

一个角色对应多个用户 生成getter和setter 查看两个表的数据 中间表定义了谁有角色,谁没有角色 根据中间表的关系,最终查询出来的列表的数据样子.这需要两个左外链接才能实现功能. 第一个左外链接就需要加上 条件判断. 再去和user表左外链接.这样执行就是我们想要的效果. 但是这里面我们不需要中间表的信息.那么查询的就是u.*和r.* 但是又会出现id的问题 这就需要起别名 把写好的语句复制过来. 比较好的方式还是在下面行前面空出来空格 用户的id没改,但是觉得id在sql语句 加了别名