• SpirngBoot设置自定义注解@NoToken去除部分接口的token验证


    前言

     项目开发中,有部分对外提供的接口需要无token调用,毕竟每次都需要先调用登录接口获取token,再去调用功能接口,还要不停的更新token,防止token过期,别的项目调用实在有点麻烦,于是开发一个notoken 的注解在不需要传token的接口controller里加上@NoToken注解,即可实现,非常方便,下面就附上代码教程,仅供参考.

    代码教程

    第一步,创建创建注解,代码如下

    1. import java.lang.annotation.Documented;
    2. import java.lang.annotation.ElementType;
    3. import java.lang.annotation.Inherited;
    4. import java.lang.annotation.Retention;
    5. import java.lang.annotation.RetentionPolicy;
    6. import java.lang.annotation.Target;
    7. @Inherited
    8. @Documented
    9. @Target({ElementType.TYPE, ElementType.METHOD})
    10. @Retention(RetentionPolicy.RUNTIME)
    11. public @interface NoToken {
    12. }

    第二步,配置token预处理拦截器

    1. import javax.servlet.http.HttpServletRequest;
    2. import javax.servlet.http.HttpServletResponse;
    3. import org.slf4j.Logger;
    4. import org.slf4j.LoggerFactory;
    5. import org.springblade.core.secure.annotation.NoToken;
    6. import org.springblade.core.secure.provider.ResponseProvider;
    7. import org.springblade.core.secure.utils.AuthUtil;
    8. import org.springblade.core.tool.jackson.JsonUtil;
    9. import org.springblade.core.tool.utils.WebUtil;
    10. import org.springframework.lang.NonNull;
    11. import org.springframework.web.method.HandlerMethod;
    12. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    13. public class TokenInterceptor extends HandlerInterceptorAdapter {
    14. private static final Logger log = LoggerFactory.getLogger(TokenInterceptor.class);
    15. public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) {
    16. HandlerMethod method = (HandlerMethod)handler;
    17. boolean methodAnno = method.getMethod().isAnnotationPresent(NoToken.class);
    18. boolean classAnno = method.getMethod().getDeclaringClass().isAnnotationPresent(NoToken.class);
    19. if (null == AuthUtil.getUser() && !methodAnno && !classAnno) {
    20. log.warn("签名认证失败,请求接口:{},请求IP:{},请求参数:{}", new Object[]{request.getRequestURI(), WebUtil.getIP(request), JsonUtil.toJson(request.getParameterMap())});
    21. ResponseProvider.write(response);
    22. return false;
    23. } else {
    24. return true;
    25. }
    26. }
    27. public TokenInterceptor() {
    28. }
    29. }

    附加代码中使用的部分类的代码 

    代码中的 AuthUtil.getUser()方法是从token解析出用户信息的方法,代码不在展示

    ResponseProvider 类代码如下 

    1. import java.io.IOException;
    2. import java.util.Objects;
    3. import javax.servlet.http.HttpServletResponse;
    4. import org.slf4j.Logger;
    5. import org.slf4j.LoggerFactory;
    6. import org.springblade.core.tool.api.R;
    7. import org.springblade.core.tool.api.ResultCode;
    8. import org.springblade.core.tool.jackson.JsonUtil;
    9. public class ResponseProvider {
    10. private static final Logger log = LoggerFactory.getLogger(ResponseProvider.class);
    11. public ResponseProvider() {
    12. }
    13. public static void write(HttpServletResponse response) {
    14. R result = R.fail(ResultCode.UN_AUTHORIZED);
    15. response.setCharacterEncoding("UTF-8");
    16. response.setHeader("Content-type", "application/json;charset=UTF-8");
    17. response.setStatus(200);
    18. try {
    19. response.getWriter().write((String)Objects.requireNonNull(JsonUtil.toJson(result)));
    20. } catch (IOException var3) {
    21. log.error(var3.getMessage());
    22. }
    23. }
    24. }

    ResultCode枚举类

    1. public enum ResultCode implements IResultCode {
    2. SUCCESS(200, "操作成功"),
    3. FAILURE(400, "业务异常"),
    4. UN_AUTHORIZED(401, "请求未授权"),
    5. CLIENT_UN_AUTHORIZED(401, "客户端请求未授权"),
    6. NOT_FOUND(404, "404 没找到请求"),
    7. MSG_NOT_READABLE(400, "消息不能读取"),
    8. METHOD_NOT_SUPPORTED(405, "不支持当前请求方法"),
    9. MEDIA_TYPE_NOT_SUPPORTED(415, "不支持当前媒体类型"),
    10. REQ_REJECT(403, "请求被拒绝"),
    11. INTERNAL_SERVER_ERROR(500, "服务器异常"),
    12. PARAM_MISS(400, "缺少必要的请求参数"),
    13. PARAM_TYPE_ERROR(400, "请求参数类型错误"),
    14. PARAM_BIND_ERROR(400, "请求参数绑定错误"),
    15. PARAM_VALID_ERROR(400, "参数校验失败");
    16. final int code;
    17. final String message;
    18. public int getCode() {
    19. return this.code;
    20. }
    21. public String getMessage() {
    22. return this.message;
    23. }
    24. private ResultCode(final int code, final String message) {
    25. this.code = code;
    26. this.message = message;
    27. }
    28. }

    第三步,使用方法

    @Notekn注解放在类上,则该类下的所有接口方法,都生效;只把@Notekn放在某个方法上,则只有该方法接口生效

    1. /**
    2. * @author liuya
    3. */
    4. @Api(tags = "对外提供接口")
    5. @RestController
    6. @NoToken
    7. public class ForeignController {
    8. @ApiOperation("测试1")
    9. @PostMapping("test1")
    10. @NoToken
    11. public R test1(){
    12. return R.success();
    13. }
    14. @ApiOperation("测试2")
    15. @PostMapping("test2")
    16. public R test2(){
    17. return R.success();
    18. }
    19. }

    相关知识 

    token

    Token技术是一种用于认证和授权的安全机制。它是在网络通信中广泛使用的一种身份验证方式,旨在确保只有经过身份验证的用户才能访问受限资源。

    1. 什么是Token? Token可以理解为一个加密后的字符串,它包含了关于用户和权限的信息。当用户进行登录或授权操作时,系统会生成一个Token,并将其发送给客户端。客户端在随后的请求中携带这个Token,服务端则通过对Token进行解析和验证来判断用户是否具备访问权限。

    2. Token的工作原理 Token的工作流程通常分为以下几步:

    • 用户进行登录:用户提供用户名和密码等凭据,在通过身份验证之后,服务端生成一个Token。
    • Token的发送与保存:服务端将Token返回给客户端,并由客户端保存,通常存储在Cookie或者本地存储中。
    • 请求携带Token:客户端在后续的请求中携带Token,通常通过HTTP请求的头部、查询参数或者请求体中的特定字段携带。
    • Token的验证:服务端在接收到请求后,通过对Token的解析和验证,确定用户的身份和权限。
    • 访问受限资源:如果Token验证通过,则服务端允许用户访问受限资源;否则,拒绝访问或返回错误信息。
    1. Token的优势和特点
    • 无状态性:Token机制是一种无状态的身份验证机制,客户端保存了Token之后,服务端不需要单独存储任何关于用户会话的信息。这使得服务端可以很轻松地进行水平扩展。
    • 跨域支持:由于Token是通过HTTP请求头部等方式传递的,所以可以轻松地实现跨域资源共享(CORS)。
    • 安全性和可扩展性:Token使用了加密算法对用户凭据进行加密,并且只在安全通道中传输。此外,由于Token机制是基于标准的JWT(JSON Web Token),使它具备了灵活的自定义性。
    1. Token生成和验证 Token的生成通常有两种方式:
    • 对称加密:服务端使用一个秘钥来加密Token,并将其发送给客户端和用于解密。这种方式简单高效,但要求服务端和客户端都知道同一个秘钥。
    • 非对称加密:服务端使用自己的私钥进行签名,发送给客户端;客户端使用服务端的公钥进行验证。这种方式更安全,但涉及到了非对称加密算法,相对复杂一些。

    在验证Token时,服务端需要解析Token并对其进行验证,一般包括以下几个方面:

    • Token的有效性:检查Token是否过期,以及是否被篡改或伪造。
    • 用户的身份和权限:从Token中提取用户标识和权限信息,并进行验证。
    1. Token的应用场景 Token技术广泛应用于各种基于Web的认证和授权场景,包括:
    • 用户登录和访问控制:通过使用Token,可以方便地实现用户的身份验证和访问控制。
    • 第三方接入:将Token分发给第三方应用程序,使其可以在用户授权的前提下访问特定资源。
    • 单点登录(SSO):通过使用Token,用户只需要登录一次,即可在多个关联系统中进行访问。

    总之,Token技术是一种重要的认证和授权机制,它通过在客户端和服务端之间传递和验证Token来保护敏感资源的访问。借助Token,可以实现高度安全和灵活的身份验证,适用于各种Web和移动应用场景。

    创作不易,觉得不错,请点赞,评论支持一下啦!!!

  • 相关阅读:
    进阶课2——语音分类
    基于STM32结合CubeMX学习Free-RT-OS的源码之两类中断解析
    项目难以管理是什么原因造成的?
    Android开发——Jetpack Compose的使用
    Django(一、简介,安装与使用)
    微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
    Vue2简单使用及相关基础知识概念(适合小白入门,看完就能上手)
    Cholesterol-PEG-Amine,CLS-PEG-NH2,胆固醇-聚乙二醇-氨基科研用试剂
    华为存储密码恢复
    Matlab论文插图绘制模板第58期—伪彩图(Pcolor)
  • 原文地址:https://blog.csdn.net/weixin_40986713/article/details/127602554