springboot的token的全局配置及整合

一.token监测流程操作

1.用户登录,生成token(EduLoginController)

》(1)拦截器(AuthHandlerInterceptor)将指定登录路径放行,所以不需验证token
》(2)查询用户是否存在
》(3)在(TokenUtil)生成token
》(4)返回token

2.头部携带token进入方法

》(1)拦截器进行拦截,并验证token状态
》(2)从头部信息获取token
》(3)在parseToken方法里,将token分解开,获取并用户信息
》(4)返回数据

第一步

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二步

在这里插入图片描述

在这里插入图片描述

二.代码及配置

1.全局的token的常量和依赖

#token application.properties的配置
token.privateKey='fdasfgdsagaxgsregdfdjyghjfhebfdgwe45ygrfbsdfshfdsag'
token.yangToken=100000
token.oldToken=300000


<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>${jwt.version}</version>
</dependency>

2.拦截器的编写

@Configuration
//@EnableWebMvc
public class AuthWebMvcConfig implements WebMvcConfigurer {
    @Autowired
    AuthHandlerInterceptor authHandlerInterceptor;
    /**
     * 给接口都配置拦截器,拦截转向到 authHandlerInterceptor
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authHandlerInterceptor)
                .addPathPatterns("/**")
                //放行登录地址
                .excludePathPatterns("/eduservice/user/login/**")
                //放行swagger
                .excludePathPatterns("/swagger-resources/**",
                        "/webjars/**", "/v2/**", "/swagger-ui.html/**");
    }
}

3.权限认证的拦截操作

@Slf4j
@Component
public class AuthHandlerInterceptor implements HandlerInterceptor {
    @Autowired
    TokenUtil tokenUtil;
    @Value("${token.privateKey}")
    private String privateKey;
    @Value("${token.yangToken}")
    private Long yangToken;
    @Value("${token.oldToken}")
    private Long oldToken;
    /**
     * 权限认证的拦截操作.
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
        log.info("=======进入拦截器========");
        // 如果不是映射到方法直接通过,可以访问资源.
        if (!(object instanceof HandlerMethod)) {
            return true;
        }
        //为空就返回错误
        String token = httpServletRequest.getHeader("token");
        if (null == token || "".equals(token.trim())) {
            return false;
        }
        log.info("==============token:" + token);
        Map<String, String> map = tokenUtil.parseToken(token);
        String userId = map.get("roles");
        String userRole = map.get("name");
        long timeOfUse = System.currentTimeMillis() - Long.parseLong(map.get("timeStamp"));
        //1.判断 token 是否过期
        //年轻 token
        if (timeOfUse < yangToken) {
            log.info("年轻 token");
        }
        //老年 token 就刷新 token
        else if (timeOfUse >= yangToken && timeOfUse < oldToken) {
            httpServletResponse.setHeader("token",tokenUtil.getToken(userId,userRole));
        }
        //过期 token 就返回 token 无效.
        else {
            throw new TokenAuthExpircedException();
        }
        //2.角色匹配.
        if ("user".equals(userRole)) {
            log.info("========user账户============");
            return true;
        }
        if ("admin".equals(userRole)) {
            log.info("========admin账户============");
            return true;
        }
        return true;
    }

}

4.登陆器

@RestController
@Api(value = "登录页面",description = "登录页面")
@RequestMapping("/eduservice/user")
@CrossOrigin //解决跨越问题
//@Api(tags = {"用户管理"}, description = "用户管理")

public class EduLoginController {

    @Autowired
    LoginService loginService;

    @Autowired
    UserService userService;

    @Autowired
    TokenUtil tokenUtil;

    @PostMapping("login/{card}/{password}")
    @ApiOperation(value = "登录", notes = "index登录页面")
    public R login(@PathVariable String card, @PathVariable String password){
        //验证账号,密码(账号具有唯一性)
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("card",card);
        userQueryWrapper.eq("password",password);
        User one = userService.getOne(userQueryWrapper);
        if (one == null){
            return R.error().data("error","用户不存在");
        }
        String name = one.getName();
        //根据用户名生成token
        String token = tokenUtil.getToken("username", name);
        return R.ok().data("token", token);
    }

    //info
    @GetMapping("info")
    @ApiOperation(value = "info")
    public R info(HttpServletRequest request) {
        String token = request.getHeader("token");
        Map<String, String> stringStringMap = tokenUtil.parseToken(token);
        return R.ok().data("roles", stringStringMap.get("roles")).data("name", stringStringMap.get("name"));
    }
}

5.全局异常监听


@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    //    自定义异常处理
    @ExceptionHandler(TokenAuthExpircedException.class)
    @ResponseBody
    public String tokenExpiredExceptionHandler(){
        log.warn("用户 token 过期");
        return "用户 token 过期";
    }
}

6.异常类TokenAuthExpircedException


public class TokenAuthExpircedException extends RuntimeException{
}

最后加上整个项目的结构
在这里插入图片描述

代码是参照半亩方糖里的文章敲的,不明白的可以去这里学习
原文链接:https://blog.csdn.net/jarvan5/article/details/113789133

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastDFS是一个开源的分布式文件系统,可以实现文件存储和查找。而Spring Boot是一个基于Spring Framework的快速开发框架。 在整合FastDFS和Spring Boot时,我们可以使用Token来实现权限的控制和安全性。 首先,我们可以使用Spring Boot提供的Token机制来验证用户的身份。当用户登录时,系统会生成一个Token,并将其返回给客户端。客户端在后续的请求中,需要将Token放在请求头中进行验证。这可以防止未经授权的用户访问受限资源。 其次,我们可以将FastDFS与Token进行整合。当用户上传文件时,系统会生成一个唯一的Token,并将Token和文件的元数据存储在数据库中。在用户下载文件时,系统会验证Token的有效性,并根据Token从数据库中获取文件的元数据,然后使用FastDFS进行文件的查找和传输。这样可以确保只有拥有有效Token的用户才能下载文件,增加了系统的安全性。 还可以通过Token来限制用户的操作权限。对于不同的用户角色,可以分配不同的Token权限。比如,管理员可以进行文件的上传和删除操作,普通用户只能进行文件的下载操作。这样可以实现对系统资源的精细权限控制。 综上所述,通过整合FastDFS和Spring Boot的Token机制,我们可以实现对文件系统的权限控制和安全性增强。用户通过验证Token来访问受限资源,同时根据Token的权限来限制用户的操作行为。这样能够提高系统的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值