JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题...

项目的权限分配,采用的是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

转载于:https://www.cnblogs.com/phpdragon/p/4197238.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值