首页 > 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验证之类的玩玩,妈耶想起来是有点麻烦,还是算了,我还是挺懒得。

阅读全文

在看李刚著的《疯狂java讲义》 反射这一部分介绍了非常多的新特性,让我大呼:原来还能这样操作?于是赶紧记录下来

 

Java8在java.lang.reflect包下新增了一个Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method俩子类

 

Executable基类提供了大量的方法来获取修饰该方法或构造器的注解信息;还提供了isVarArgs ()方法用于判断该方法或构造器是否包含可变数量的形参,以及通过getModifiers()方法来获取该方法或构造函器的修饰符,除此之外Executable提供了如下俩个方法来获取该方法或该参数的形参个数以及形参名。

Int getParameterCount():     获取该构造器或方法的形参个数

Parameter[] getParameters():      获取该构造器或方法的所有形参

 

上面第二个方法烦恼会了一个Parameter[]数组,Parameter也是java8新增的API,每个Parameter对象就代表方法或者构造器的一个参数,parameter也提供了大量的方法来获取声明该变量的泛型信息,还提供了如下常用方法来获取参数信息。

>getModifiers()   获取修饰该形参的修饰符

>String getName():     获取新参名

>Type getParameterizedType():       获取带泛型的新参类型

>Class<?> getType():  获取形参类型

>boolean isNamePresent():      该方法返回该类的class文件中是否包含了方法的形参名信息

>boolean iaVarArgs(): 该方法用于判断该参数是否为可变形参

 

阅读全文

自己造轮子还是有意思啊

 

 

工厂模式

 

根接口

 

具体实现类之结果集一行转换为对应对象

 

 

 

具体实现类之基本数据类型及String及包装类的转换

 

具体实现类之Deta类的转换

 

阅读全文

 

 

这回增删改都有啦,除了上次写的那个返回一个集合的以外,还加了个查询单条数据只返回一个对象的重载方法

增删改倒是挺简单的

 

 

阅读全文

用Apache的包那么舒服,自己也手痒了想写个玩玩

写了大概俩小时= = 期间遇到好多问题简直心态爆炸,好歹还是摸索出来了

颤抖的运行main方法、一次次的异常、刺眼的红字屡屡的嘲笑我

最后一次运行时。终于得出了我想要的结果,那一瞬间成就感简直爆炸,我能感受到大脑的多巴胺分泌迅速升高

 

不多说了贴代码:

 

期间遇到的问题:

一开始是想用ResultSet结果集直接提取数据,用getObject(属性名/列名)。

然后使用反射得到的set方法,将提取到的数据作为参数给T对象进行赋值,结果直接雪崩。

试了半天,把各种属性都打印出来验证了个遍才知道

这玩意把Oracle中的NUMBER类型用getObject()提取出来后是个BigDecimal类型,我也是醉了。必须要用getInt()才行

我实验的是传个oracle中ORCL数据库里的emp表进去,里边有个时间单位,放进java里应该是sql.Date这个类型

结果通过getObject提取出来后是个Timestamp类型,也不能直接往set方法里塞。必须要用getDate()方法

 

后来思路就是,既然我获取了T对象的setXXX方法,那我也可以获取ResultSet的getXXX嘛

然后使用

String rsFieldName = “get”+f.getType().getSimpleName().substring(0,1).toUpperCase()+f.getType().getSimpleName().substring(1);

得到getXXX的具体名字

然后再用Method类把ResultSet的方法具现化出来,注意这儿只能用ResultSet.class来获得类对象

把取出的变量赋值给Object,然后就能够使用T的set方法进行具体赋值了。

阅读全文
EA PLAYER &

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

      00:00/00:00