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;
}
目录
打赏
0
0
0
0
88
分享
相关文章
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
358 11
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
134 1
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
本文介绍了如何使用Spring框架的注解方式实现AOP(面向切面编程)。当目标对象没有实现接口时,Spring会自动采用CGLIB库进行动态代理。文中详细解释了常用的AOP注解,如`@Aspect`、`@Pointcut`、`@Before`等,并提供了完整的示例代码,包括业务逻辑类`User`、配置类`SpringConfiguration`、切面类`LoggingAspect`以及测试类`TestAnnotationConfig`。通过这些示例,展示了如何在方法执行前后添加日志记录等切面逻辑。
865 2
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
227 1
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
9月前
|
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
208 2
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
详解 Java 限流接口实现问题之在Spring框架中使用AOP来实现基于注解的限流问题如何解决
详解 Java 限流接口实现问题之在Spring框架中使用AOP来实现基于注解的限流问题如何解决
172 0
JWT和Security 登录权限判断和token访问和让token失效
JWT和Security 登录权限判断和token访问和让token失效
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等