龙空技术网

JAVA自定义注解实现权限管理

Coding周老师 1305

前言:

眼前咱们对“java权限管理实现”大概比较关怀,各位老铁们都想要学习一些“java权限管理实现”的相关资讯。那么小编同时在网络上搜集了一些有关“java权限管理实现””的相关知识,希望你们能喜欢,我们一起来学习一下吧!

背景

最近做的项目是前后端分离的,后端主要是springboot,前端是vue,因为角色比较少所以就没有引入springsecurity,而是单纯使用自定义注解和拦截器实现了一个简单的权限认证。

主要知识点:

1、java自定义注解的使用

2、spring拦截器的使用

3、此示例为简版权限管理,只有用户和角色认证,没有添加url的验证

实现权限管理,首先要明确权限认证的流程:

下面一个简单的流程图

今天分享的内容主要是在3/5/6节点。

注解在Java中应用非常普遍,是从JDK1.5开始提出的,注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。最常见的@Override、@param、@return 等,另外常用的各种框架也都有自己的注解体系,例如学习spring肯定会用到的@Autowired、@Component、@Bean等等。使用注解可以让我们的代码非常简洁和灵活,也很容易理解。

一般常用的注解可以分为三类:

一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。

一类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档。

一类为自定义注解,可以根据自己的需求定义注解。

本文中我们实现一个自定义注解,可以标明某个方法需要某种权限才可以访问,代码如下:

关于Target和Retention:

@Target 表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,仅仅排除一个属性,那么你需要在定义target包含所有的属性。

ElementType.TYPE:说明该注解只能被声明在一个类前。

ElementType.FIELD:说明该注解只能被声明在一个类的字段前。

ElementType.METHOD:说明该注解只能被声明在一个类的方法前。

ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。

ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。

ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。

ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。

ElementType.PACKAGE:说明该注解只能声明在一个包名前。

@Retention 定义该注解的生命周期。

RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。

RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

枚举类RoleType如下:

这个是根据自己的业务确定的

另外就是拦截器,因为我后台用的是springboot,需要使用拦截器拦截请求然后验证其权限:

控制器的方法上是这个样子的:

有了以上的内容,就可以实现简单的权限认证了,另外还需要在用户登录的时候将用户的身份标识放到可以获取的地方,例如session、redis等。

因为我是前后端分离的,所以测试都是用的postman,这里就不晒效果了。

如果项目比较复杂,逻辑比较多,建议使用springsecurity等比较完善的框架,本文介绍的只适用于小型系统或自己学习,毕竟系统庞大了,逻辑就复杂的多,如果全靠自己去实现一个权限认证框架,工作量太大而且也不一定靠谱。

有对此感兴趣或者有问题的,可以一起聊聊。

标签: #java权限管理实现 #java 数据权限设计