Jwt使用Aop方式自定义权限注解认证

简介: 使用Aop前置通知方式, 在控制层上使用指定切面注解, 并赋予注解参数为访问接口所需角色权限代码, 进行身份认证和权限校验

环境 JDK11, SpringBoot 2.2.2.RELEASE


相关依赖坐标:

implementation'org.springframework.boot:spring-boot-starter-aop'implementation'io.jsonwebtoken:jjwt:0.9.0'

1.自定义权限认证注解

importjava.lang.annotation.*;
/*** 角色权限校验注解*/@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic@interfaceHasRoles {
String[] roles() default"";
}

2、Aop前置通知切面类

importcom.example.dynamicdatatable.domain.SysAccountInfo;
importcom.example.dynamicdatatable.enums.AccountType;
importcom.example.dynamicdatatable.repository.SysAccountMapper;
importlombok.extern.slf4j.Slf4j;
importorg.aspectj.lang.annotation.Aspect;
importorg.aspectj.lang.annotation.Before;
importorg.aspectj.lang.annotation.Pointcut;
importorg.springframework.stereotype.Component;
importorg.springframework.util.ObjectUtils;
importjavax.annotation.Resource;
importjavax.servlet.http.HttpServletRequest;
importjava.util.HashSet;
importjava.util.Set;
/*** 权限认证切面类*/@Aspect@Slf4j@ComponentpublicclassCheckRoleAop {
@Pointcut(value="@annotation(HasRoles)")
publicvoidpointCut() {};
@ResourceprivateSysAccountMapperaccountMapper;
@ResourceprivateHttpServletRequestrequest;
/*** todo 身份认证和权限比对* @param hasRoles  权限认证注解入参*/@Before(value="pointCut()&&@annotation(hasRoles)")
publicvoidexec(HasRoleshasRoles) {
// jwt解密认证// ...// jwt解密认证结束longid=10; // 模拟解析Token后 取得的id值AccountTypeaccountType=AccountType.ADMIN_TYPE;   // 模拟解析Token后, 取得的用户账户类别// 每次请求都动态实时的去查询用户信息和权限信息SysAccountInfoaccountInfo=accountMapper.findById(id, accountType);
if (ObjectUtils.isEmpty(accountInfo) ||!accountInfo.isEnableState() ||accountInfo.isDelState()) {
log.error("用户不存在");
thrownewRuntimeException("用户不存在");
        } else {
// 模拟从数据库中查询账户拥有的角色身份权限Set<String>rolesToken=newHashSet<String>(1) {
privatestaticfinallongserialVersionUID=-1307833886578391108L;
                {
add("admin");
                }
            };
String[] roles=hasRoles.roles();
if (roles.length==0) {
return;
            } else {
for (Stringrole : roles) {
if (rolesToken.contains(role)) {
// 将解析后的Token信息实体缓存到请求域中JwtSessionCacheEntityjwtSessionCacheEntity=newJwtSessionCacheEntity();
jwtSessionCacheEntity.setId(id);
jwtSessionCacheEntity.setAccountType(accountType);
jwtSessionCacheEntity.setRoleCode("admin");
request.setAttribute("info", jwtSessionCacheEntity);
return;
                    }
                }
            }
log.warn("用户无对应的权限");
thrownewRuntimeException("无权限");
        }
    }
}

3、请求域缓存实体类

importlombok.Data;
importjava.io.Serializable;
/*** Jwt 请求域缓存数据实体*/@DatapublicclassJwtSessionCacheEntityimplementsSerializable {
privatestaticfinallongserialVersionUID=-4634413454684601681L;
privateLongid;
privateStringroleCode;
privateAccountTypeaccountType;
}

4、账户类型枚举类

importlombok.AllArgsConstructor;
importlombok.Getter;
/*** 账户类型枚举类*/@Getter@AllArgsConstructorpublicenumAccountType {
ACCOUNT_TYPE(1, "sys_account_info"),
ADMIN_TYPE(2, "sys_admin_info"),
    ;
privateintcode;
privateStringtableName;
}
目录
相关文章
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
467 0
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
543 1
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【10月更文挑战第2天】在当今互联网世界中,数据安全与隐私保护日益重要。Python 作为广泛应用于 Web 开发的语言,其认证机制也不断进化。OAuth 2.0 和 JSON Web Tokens (JWT) 成为当前最热门的安全认证方案,不仅保障数据安全传输,还简化了用户认证流程。本文将介绍 Python 如何结合 OAuth 2.0 和 JWT 打造安全高效的认证体系。
159 3
|
8月前
|
存储 安全 JavaScript
秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全
本文探讨了如何通过JWT认证保障WebSockets通信安全,防止敏感数据泄露和未授权访问。首先介绍了保护WebSockets的重要性,随后详细讲解了JWT与WebSockets的协同工作流程:特工通过API登录获取JWT,建立连接时提供令牌,服务器验证后决定是否授权。还提供了Node.js实现示例及客户端连接方法,并分享了最佳实践,如使用HTTP-only Cookie、短生命周期令牌和WSS加密。最后推荐了Apipost工具助力实时测试与调试,确保构建高效安全的实时网络。
|
11月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
829 11
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
983 8
|
XML Java 数据格式
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
本文介绍了如何使用Spring框架的注解方式实现AOP(面向切面编程)。当目标对象没有实现接口时,Spring会自动采用CGLIB库进行动态代理。文中详细解释了常用的AOP注解,如`@Aspect`、`@Pointcut`、`@Before`等,并提供了完整的示例代码,包括业务逻辑类`User`、配置类`SpringConfiguration`、切面类`LoggingAspect`以及测试类`TestAnnotationConfig`。通过这些示例,展示了如何在方法执行前后添加日志记录等切面逻辑。
1359 2
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
211 3
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
305 1
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
489 2