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;
}
目录
相关文章
|
5月前
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
127 1
|
5月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【10月更文挑战第2天】在当今互联网世界中,数据安全与隐私保护日益重要。Python 作为广泛应用于 Web 开发的语言,其认证机制也不断进化。OAuth 2.0 和 JSON Web Tokens (JWT) 成为当前最热门的安全认证方案,不仅保障数据安全传输,还简化了用户认证流程。本文将介绍 Python 如何结合 OAuth 2.0 和 JWT 打造安全高效的认证体系。
55 3
|
2月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
104 11
|
4月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
112 8
|
5月前
|
XML Java 数据格式
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
本文介绍了如何使用Spring框架的注解方式实现AOP(面向切面编程)。当目标对象没有实现接口时,Spring会自动采用CGLIB库进行动态代理。文中详细解释了常用的AOP注解,如`@Aspect`、`@Pointcut`、`@Before`等,并提供了完整的示例代码,包括业务逻辑类`User`、配置类`SpringConfiguration`、切面类`LoggingAspect`以及测试类`TestAnnotationConfig`。通过这些示例,展示了如何在方法执行前后添加日志记录等切面逻辑。
559 2
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
|
4月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
64 3
|
4月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
84 1
|
4月前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
189 2
|
5月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
6月前
|
安全 Java 数据安全/隐私保护