讨论:大家的权限检测都放在哪一层?

前面有很多人深入讨论权限的建模问题,但具体到一个项目,权限放到哪一层也是让人迷惑的问题。我说说我遇到的问题:

客户端(包括JSP和GUI)-EJB-业务逻辑-DAO层 的结构。一般来说,权限的处理有几种方式:

1.放在客户端。登录之后从服务器端得到用户的权限,在客户端的View层调用EJB业务方法前,先调用一个canDo的函数进行权限判断,如果具有相
关权限才可以调用EJB方法。如果只有JSP/Servlet的访问方式,这种方法是比较安全的,还可用filter或者Action重载来实现统一校验。但是如果
有GUI可以访问,那程序员完全可以作一个跳过权限检测方法的版本。所以说安全性低。


2.在EJB层作统一的Session Facade进行校验。可以这样作:EJB访问有统一入口,所有访问交互信息都封装成一个Request对象,这个对象中包含
“登录用户标识”,调用业务逻辑方法标识和方法参数等信息。在Facade中通过这个对象中的“登录用户标识authToken”(在服务器端保存的一个
用户登录Map,key=authToken, value=UserInfo)先进行权限检测。如果通过,再根据Request中其他参数判断具体调用哪个业务逻辑。这样作安全
性较高,但麻烦之处是所有的业务方法调用都要封装成Request类型。而且服务器端要多出解析Request对象部分。

3.在业务逻辑方法上加一层Proxy类进行权限处理,类似于jive。但由于有EJB这一层,GUI和JSP/Servlet都访问EJB的方法,因此,为了让服务器端
的业务逻辑方法知道是哪个用户在执行该方法,必须在session bean的方法中都加上一个用户标识的参数。这样作安全性也很高,但EJB的每个方法
都加上一个用户标识的参数和抛出UnAuthorizedException,显得非常不简洁,甚至恶心!


以上三个方法各有优劣,但说实话都不满意,不知道大家有什么好的经验和看法,欢迎讨论!

自己顶一下