aop的好处就在于它可以只让你写一次代码,然后这些代码就可以用于容器当中的所有对象,权限拦截校验是一个表现形式。
那么,我们要如何实现这个功能?
首先,定义一个注解:
![aeb3d791a0be1ac21124f359cc420d88.png](https://i-blog.csdnimg.cn/blog_migrate/8b29715c27b69811352b92eb3247baa0.jpeg)
这里有一个PermissionEnum枚举类,当然可以直接使用String 代替,不过不推荐,其源码如下:
![dd49395fc3d7662f29f870276928817e.png](https://i-blog.csdnimg.cn/blog_migrate/e875a1f01916ac3dbda0ff64a0cb1ba7.jpeg)
这里,我们控制的权限颗粒度是方法,所以必须使用一个标识符来标志出每个方法,我们只要将Permission注解加到方法之上,就能被切面所拦截,并进行权限校验:
![7dc158c57eb72443677c3a2f9c7ef0ea.png](https://i-blog.csdnimg.cn/blog_migrate/22e327d91adec98e1c717639f20ab7c3.jpeg)
上面是一个方法示例:
接下来就是重点了,切入点的编写:
![017882926c8d62bb40f72a6a8f5ad489.png](https://i-blog.csdnimg.cn/blog_migrate/4633a564e77297d23e87a71eb6a9d91c.jpeg)
代码虽然有点长,但做的事并不多,无非就是获取当前登录管理员的权限,然后判断该其切点的权限要求当前管理是否满足,满足就继续运行,否则抛出一个权限错误的异常。
当然,这个权限拦截校验方案是写死的,也就是说你无法根据实际的情况需要添加或者删除的相应权限,因为这是由系统的权限控制方案所限定的,我们权限拦截的目标是方法,不像其他诸如URL的拦截方案,想要修改方法,即拦截目标,就必须修改源码,所以也就没有必要做成高度可自定义化的权限方案。