项目的权限分配,采用的是RBAC的设计模式。后台配置权限的时候,需要获取到所有的权限因子。

不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的反射机制。

于是把PHP项目的经验带到JAVA项目中,发现PHP中的经验在java中,实现起来不是那么的方便。

这主要的原因:
一是语言上的特性导致权限控制方面的差异性。

二是项目使用的是SSH框架,action的名称已经使用注解替换了原有名称。使用反射获取到的类名和方法名组合,不是有效的权限因子(当然,解决方法还是反射)。

三是使用的是apache的shiro权限控制,自动注解型,判断是根据注解值来判断的。而经手过的PHP项目是本身控制权限无需事先绑定权限注解(语言特性差异、框架设计模式差异)。

问题就来了,如何拿到每一个方法上的权限注解呢?

代码如下:

 /**
* 查找所有权限因子
*
* @author phpdragon
* @date 2014-12-24 下午9:53:49
* @param args
* @throws Exception
* @description :
* @return void
* @throws
*/
public Map<String, String> findAllRequiresPermissions() {
String packagePath = ServletActionContext.getServletContext()
.getRealPath("/");
packagePath += "/WEB-INF/classes/com/xxx/action/backManage"; String packageName = "com.xxx.action.manage";
List<Class<?>> classes = new ArrayList<Class<?>>(); Map<String, String> result = new HashMap<String, String>();
try {
classes = findAllClass(packageName, packagePath);
for (Class<?> clas : classes) {
Method[] methods = clas.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(RequiresPermissions.class)) {
String[] annotation_value = method.getAnnotation(
RequiresPermissions.class).value();
for (String val : annotation_value) {
result.put(val, val);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
} /**
* 查询某目录下所有类文件
*
* @author phpdragon
* @date 2014-12-24 下午9:56:33
* @param packageName
* @param packagePath
* @return
* @description :
* @return List<Class<?>>
* @throws
*/
private List<Class<?>> findAllClass(String packageName, String packagePath) {
List<Class<?>> classes = new ArrayList<Class<?>>();
try {
// 获取此包的目录 建立一个File
File dir = new File(packagePath);
// 如果不存在或者 也不是目录就直接返回
if (!dir.exists() || !dir.isDirectory()) {
return classes;
}
// 如果存在 就获取包下的所有文件 包括目录
File[] dirfiles = dir.listFiles();
// 循环所有文件
for (File file : dirfiles) {
// 如果是目录 则继续扫描
if (file.isDirectory()) { } else {
// 如果是java类文件 去掉后面的.class 只留下类名
String[] tmp = file.getName().split("\\.");
String file_type = tmp[tmp.length - 1].toLowerCase();
String className = file.getName().substring(0,
file.getName().length() - file_type.length() - 1);
try {
// 添加到集合中去
classes.add(Class
.forName(packageName + '.' + className));
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return classes;
}

好了,现在可以拿到有效的权限因子了,可以继续下面的权限分配工作了。

结论:
1.在现开发环境下的权限配置相比于经手过的PHP项目,权限因子需要手动配置并写死在配置文件或代码注解上。同样的功能,JAVA项目会相对复杂一些。

2.如果采用原始的serverlt开发方式,事先在调用action 和 method 前进行了权限判断集成的话,权限判断会简单很多。当然,在SSH框架中使用自定义的过滤器的话,以上都不是问题。

3.在SSH框架中实现权限控制方式很多种,以上所有结论只在当前开发环境下有效,如有出路,望斧正。

PS:

http://blog.csdn.net/jdzms23/article/details/17550119

http://www.cnblogs.com/mengdd/archive/2013/02/02/2890182.html

http://www.wl566.com/biancheng/152312.html

http://blog.csdn.net/justinavril/article/details/2873664

http://blog.csdn.net/bao19901210/article/details/17201173

http://blog.csdn.net/lfsf802/article/details/7392336

http://zhidao.baidu.com/link?url=bfmG-TjKbnw_OIcqgcYZ5jgMsWz9nNuXcC4CJAq6R6lyNp1ifUrVfbw-aBwJ6akIC2DABoRpbMmOxfLu1gYKRq

http://cuisuqiang.iteye.com/blog/1511887

JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题的更多相关文章

  1. 介绍下Java内存区域(运行时数据区)

    介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...

  2. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

  3. Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法

    Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法 在用tomcat运行WEB项目,并且使用了StringUtils包的时候,会出现 jav ...

  4. 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

    对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成clas ...

  5. Java 进阶巩固:什么是注解以及运行时注解的使用

    这篇文章 2016年12月13日星期二 就写完了,当时想着等写完另外一篇关于自定义注解的一起发.结果没想到这一等就是半年多 - -. 有时候的确是这样啊,总想着等条件更好了再干,等准备完全了再开始,结 ...

  6. Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】

    接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy   动态代理 Befor talking abou ...

  7. 【Java】关于JVM运行时内存空间、JVM垃圾回收机制

    参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...

  8. Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  9. Java虚拟机一:运行时数据区域

    java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行 ...

随机推荐

  1. 在android中使用logback-android日志框架配置 slf4j + logback

    为什么使用 slf4j + logback logbak定位于log4j的替代者,logback同样支持slf4j,方便被替换.在Android平台上,我在使用log4中遇到tag混乱的问题.相比lo ...

  2. svn cleanup失败

    今天用SVN的时候出现被锁定的情况,既不能更新代码也不能提交. 解决方法如下: 1. 在被锁定的文件夹上点右键,找到并点击Clean up菜单项 2. 在Cleanup对话框中勾选“Break loc ...

  3. 【C】——setvbuf(scanf内存溢出问题)

    下面设置了一个长度为20的缓存区,循环对value进行赋值并输出: #include<stdio.h> #define BUFSIZE 20 int main(int argc, char ...

  4. windows 中 到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe windows/system32

    到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe JavaWindowsCC++C#  当电脑里面有多个jdk或是jre时,在cmd里面到底是用的哪个 ...

  5. Linux共享库 Linux内核链表

    #ifndef __LINKEDLIST_H_ #define __LINKEDLIST_H_ #include <stdlib.h> #define offsetof(type, mem ...

  6. 自然语言交流系统 phxnet团队 创新实训 个人博客 (十三)

    关于java socket的一些总结: Java Socket通信有很多的时候需要我们不断的学习.方面效率虽然不及C与C++但它以灵活语言优势,为大家广为使用. 本文就对在使用java做通信方面程序时 ...

  7. e612. Moving the Focus to the Next or Previous Focusable Component

    The methods to move the focus to the next or to the previous focusable component are Component.trans ...

  8. JSONObject相关依赖架包下载(Maven依赖下载)

    一.开发场景Java开发当中经常需要Json格式的数据,这就用到JSONObject类,本文章只提供以下两种JSONObject对应架包的下载方式.1.com.alibaba.fastjson.JSO ...

  9. Unity GUI(uGUI)使用心得与性能总结

    Unity GUI(uGUI)使用心得与性能总结 作者 kingshijie 关注 2015.09.26 15:35 字数 3686 阅读 28031评论 10喜欢 49 背景和目的 小哈接触Unit ...

  10. EXP无法导出空表的表结构解决办法

    原文链接:http://www.cnblogs.com/Mr_JinRui/archive/2012/11/05/2755035.html 早的一次使用oracle 11g导出数据发现有的表丢失了,感 ...