首页 > 经验记录 > java > 基于SpringMVC拦截器与Annotations+Reflex做服务端权限控制

基于SpringMVC拦截器与Annotations+Reflex做服务端权限控制

 

又到了我第二喜欢的玩反射时间了。真快乐啊。

如标题所说,我写了个权限控制。权限控制的精髓就是限制用户访问范围。一个系统,总得有后台、管理者这些绕不开的玩意儿。

还有用户所代表的各种不同角色,如游客、登陆者、管理员、代理商、作者、编辑,等等等等。他们这些角色在一个庞大的系统里能够操作的地方总归是不同的。

如果单单依赖前端的权限控制,难免会被人家利用抓包之类的手段获取其他角色能操作的区域信息来做一些危险操作。

后端的权限控制是必不可少的,当然,在java领域现在SpringSecurity、shiro之类的安全框架肯定是一个优选,我很久之前也写过关于SpringSecurity的配置,可见: Spring Security集成以及配置

但是我就是tm要自己写一个,哎嘿嘿,(⁄ ⁄•⁄ω⁄•⁄ ⁄)

 

咳咳,关于我写的这个权限控制,我自己感觉还是特别骚的。亲自试了两天,确实没什么问题。我需要它能够做它确实做到了。

下面详细解释一下。

这个注解,是关键。里面有一个内部枚举,与其息息相关。注解的唯一一个参数就是该枚举。

@Impower 注解代表需要控制

Level 枚举表示控制范围

 

实现的效果就是:在上(Controller层的)写入该@Impower 注解,例如: @Impower(level = Impower.Level.Admin) ,那么,即代表该类需要权限控制,并且只有 Admin 这个角色,或者比Admin角色权限更高的角色 ,才能够请求该类中的方法。

如果在方法上加入该@Impower 注解,如果@Impower同时存在类上,外部请求该方法时,则会无视类注解,按照方法上该注解来进行判定权限是否能够访问。

Level 枚举内部的权限可自己随意定义,只要保证其权限范围顺序从左到右、从上到下线性递减即可。

注:系统的用户必须有一个属性是以Impower . Level 作为其类型。才能够进行权限控制。

 

前后端均可使用,前台可通过thymeleaf、freemark等模板来对用户显示进行控制,若是前后端分离的项目也没事,请求后台的时候做一下check()判定就好了。

并且想修改非常方便,这已经很极限的做到了降低耦合。想要增加不同的权限也好、修改某些方法可访问的权限也好、前台对权限的控制也好。有变更只需要更改很小的地方。

 

 

这儿是具体进行权限判定、从而决定是否放行的拦截器,关于SpringBoot的拦截器配置,若有不清楚的地方可看我之前写过的文章:

SpringBoot使用WebMvcConfigurerAdapter+HandlerInterceptorAdapter实现拦截

 

这里我对基本只会验证是否登录的拦截器做了拓展,获取了该请求所请求的类、方法上的注解,从而通过Session中的已登录对象来进行判定权限是否能够访问。

会使用Level  中的 check() 方法来进行判定该登陆角色的权限是否能够通过。

若通过判定,则成功访问该页面(能够正常请求响应),若判定失败,则请求失败,但是response状态码仍然会是200,只不过返回的内容是空罢了。

 

又写了一些骚东西,别的不嗦,我这玩意写出来还真挺好用的。实际体感顺滑流畅,代码优雅,功能简洁却强悍。

但是后端的权限控制可不止这么点哦,最好与JWT(JSON Web Token)进行同步使用,我本来也想自个写个Token验证之类的玩玩,妈耶想起来是有点麻烦,还是算了,我还是挺懒得。


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00