的确,这是一个很好的入口,更好的入口是Service层. 对于权限,以我目前的理解,是要分成两个问题:权限引擎和权限引入. 引擎就是要能提供一个可以切入应用逻辑的运算模块,做到: 1.能将从业务逻辑中提取出权限逻辑. 2.能够根据权限逻辑,对于当前操作进行运算,得到权限判断结果. 引擎是个相对独立的部分. 引入就是要能做到尽量透明的在系统中插入权限控制,必须: 1.尽量对业务透明. 2.提供合适的控制粒度. 引入可以采用AOP的Interceptor,只要在合理的层次上插入,就可以完成权限控制了. 在Action层插入,是一个方式.但是,因为Action层次的信息仍然不够丰富.更好的方式是在Service层次插入(对DomainObject操作). robbin 写道 早先我做过一个系统,就是采用在Service层实现权限控制,但是后来发现不如在Action层实现起来方便。一方面是因为B/S应用中,客户端的请求动作本来就是一个一个的HTTP GET/POST,要做到最准确的权限控制,则必须针对Action。另一方面来说,如果你在Service层做权限控制,意味着你在Action还要写权限判定代码,那么就显得非常烦琐了。 如果要精确控制,必须要在比 Action 更细的层次做.举例来说: 论坛的帖子显示界面,如果当前用户对当前帖子有删除权限,则显示删除链接.否则,就不显示. 当前的操作(Action)是显示帖子,但是显示链接的逻辑判断需要对另外一个功能(删除功能)进行判断.这个判断是业务的必须,没有办法省略. 代码 - public class ViewArticle implements Action {
- public String execute() {
- ....
- }
- public boolean isDeleteAble() {
- ....
- }
- public boolean isEditAble() {
- ....
- }
- }
<script type="text/javascript">render_code();</script> 如果是对 Action 进行控制的话,恐怕就需要构造一个 URL 再行判断了.此外,Role等信息也难于获取. | jackyz 写道 robbin 写道 早先我做过一个系统,就是采用在Service层实现权限控制,但是后来发现不如在Action层实现起来方便。一方面是因为B/S应用中,客户端的请求动作本来就是一个一个的HTTP GET/POST,要做到最准确的权限控制,则必须针对Action。另一方面来说,如果你在Service层做权限控制,意味着你在Action还要写权限判定代码,那么就显得非常烦琐了。 如果要精确控制,必须要在比 Action 更细的层次做.举例来说: 论坛的帖子显示界面,如果当前用户对当前帖子有删除权限,则显示删除链接.否则,就不显示. 当前的操作(Action)是显示帖子,但是显示链接的逻辑判断需要对另外一个功能(删除功能)进行判断.这个判断是业务的必须,没有办法省略. 代码 - public class ViewArticle implements Action {
- public String execute() {
- ....
- }
- public boolean isDeleteAble() {
- ....
- }
- public boolean isEditAble() {
- ....
- }
- }
<script type="text/javascript">render_code();</script> 如果是对 Action 进行控制的话,恐怕就需要构造一个 URL 再行判断了.此外,Role等信息也难于获取. 如果这样来写ACTION,那Action也太不"纯粹"了,包含了太多和当前action无关的逻辑,既然是要进行界面元素的显示控制,就在界面上控制好了,比如用taglib,至于权限列表,保存在session,显示界面元素时时取出对比一下,有此权限就显示此界面元素,没有就不显示. | ruby 写道 如果这样来写ACTION,那Action也太不"纯粹"了,包含了太多和当前action无关的逻辑,既然是要进行界面元素的显示控制,就在界面上控制好了,比如用taglib,至于权限列表,保存在session,显示界面元素时时取出对比一下,有此权限就显示此界面元素,没有就不显示. 确实不纯粹.但是,对于实例级别的权限控制,似乎没有更好的办法. 首先,明确一下.这里的需求是:实例级的权限控制(就是控制到谁对什么资源[的哪一个实例]具有什么操作).而不是功能级的权限控制(就是控制到谁对什么资源[不管哪一个实例都]具有什么操作). 实例级的权限控制,比如,A用户可以删除A帖子,但不能删除B帖子.它与具体资源的实例相关. 功能级的权限控制,比如,A用户可以删除帖子(A用户具有删除帖子的权限,不管什么帖子).它与具体资源的实例无关. 功能级的权限控制,与用户和资源类型相关,对于特定的用户来说,枚举资源类型得到的列表是确定的,确实可以用Session保存列表,在显示逻辑中处理.但是,实例级的权限控制,与具体的实例相关,对特定的用户,不可能枚举所有资源的实例. 这种情况下,只有Action的处理过程本身能够确定对于特定实例(ArticleId=xxx)做出权限判断. 从另一个角度来看,这里的Action实际上是一个"交互层",即,它服务于显示逻辑,显示逻辑需要一个"是否可以删除"的属性,那么它就应该提供,不管是从Session来取.还是从权限引擎来运算,这是另外一个问题. 这个做法应该说是合理的,但是,否有更好的方法,有待探讨. | 在action中的拦截只能拦截功能型的权限 而把实例型的的权限校验写在action里不是很好,action应该只是转发 觉得应该在action的下一层来实现这个校验,这样权限校验的耦合度还能第点,权限校验也方便重用。 比方说你要显示删除的时候要进行权限校验,真正删除的时候也要进行同样的校验,这样就应改把全校校验分离出来,我也不懂,瞎想的。 | ruby 写道 jackyz 写道 robbin 写道 早先我做过一个系统,就是采用在Service层实现权限控制,但是后来发现不如在Action层实现起来方便。一方面是因为B/S应用中,客户端的请求动作本来就是一个一个的HTTP GET/POST,要做到最准确的权限控制,则必须针对Action。另一方面来说,如果你在Service层做权限控制,意味着你在Action还要写权限判定代码,那么就显得非常烦琐了。 如果要精确控制,必须要在比 Action 更细的层次做.举例来说: 论坛的帖子显示界面,如果当前用户对当前帖子有删除权限,则显示删除链接.否则,就不显示. 当前的操作(Action)是显示帖子,但是显示链接的逻辑判断需要对另外一个功能(删除功能)进行判断.这个判断是业务的必须,没有办法省略. 代码 - public class ViewArticle implements Action {
- public String execute() {
- ....
- }
- public boolean isDeleteAble() {
- ....
- }
- public boolean isEditAble() {
- ....
- }
- }
<script type="text/javascript">render_code();</script> 如果是对 Action 进行控制的话,恐怕就需要构造一个 URL 再行判断了.此外,Role等信息也难于获取. 如果这样来写ACTION,那Action也太不"纯粹"了,包含了太多和当前action无关的逻辑,既然是要进行界面元素的显示控制,就在界面上控制好了,比如用taglib,至于权限列表,保存在session,显示界面元素时时取出对比一下,有此权限就显示此界面元素,没有就不显示. 在页面控制很危险的,可能你的页面上控制不让他显示了,但是用户能手动输出地址呀,这不还是要转到内部去校验么? | 引用 页面控制很危险的,可能你的页面上控制不让他显示了,但是用户能手动输出地址呀,这不还是要转到内部去校验么? 这儿的"控制",控制的是页面元素的显示与否,而不是进行权限的控制,具体一点讲,我们除了在action(iterceptor)或者更低一层(service)里面进行权限控制以外,还要在页面上管理相关页面元素的显示与否,目的不是为了控制,而是为了页面的"干净",比如,一个不具备"删除帖子"这个权限子的用户登录了以后,最好是不要把帖子的删除功能的"链接"显示出来,这样页面不就更人性一点了?(和我无关都不要给我显示,显示出来的都是我能操作的),如果他知道这个删除功能的link,直接在浏览器里面手写提交,那么在服务器端自然还有进一步的验证,比如在Action里面,比如在Service里面,然后会再导航到相关信息提示或者出错页面.至少前面提到的实例一级的权限控制和功能一级的权限控制,我一般不会用到料度太细的实例一级,(比如对AA,BB用户提交的帖子有删除权限,而对CC这个领导提交的帖子却是只读的)...倒是很想听听这方面的管理,实例一级的控制,那权限的粒度这么小,管理不是非常麻烦?不过可能在电子政务和政府相关项目产品中会用得比较多一点吧 | 控制权限,不但在要页面上,程序内部也必须控制,否则是相当危险的. 一般我的做法是在页面上进行粗粒度的控制,在程序内容进行细粒度的控制. 根据权限控制显示和根据权限控制执行在业务中,肯定都是必须的.缺少显示控制则界面将不够人性化.缺少执行控制则权限形同虚设. 这里举显示的例子,是为了表明,在Action的这个层次,除了一对一的执行控制以外,还有一对多的显示控制.所以,在Action这个层次并不是进行权限对应的合理层次. 控制应该是基于Action之下的Service层次.比如: 如此的框架:
代码 - public Interface Action {
- public String execute() throws ActionException;
- }
- public Interface Service {
- public void rule() throws ServiceExcception;
- pulblic Object flow() throws ServiceException;
- }
- public Class ServicePerformer {
- public boolean check(Service service) {
- boolean result = false;
- try {
- service.rule();
- result = true;
- } catch (ServiceException e) {
- }
- return result;
- }
- public Object perform(Service service) throws ServiceException {
- Object result = null;
- service.rule();
- result = service.flow();
- return result;
- }
- }
<script type="text/javascript">render_code();</script> 那么,具体的一个实现可能类似:
代码 - public class ViewAction implements Action {
-
- private Service deletService;
- private Service detailService;
-
- private ServicePerformer servicePerformer;
-
- private ArticleDetail articleDetail;
- public String execute() throws ActionException {
- try {
- articleDetail = servicePerformer.perform(detailService);
- return SUCCESS;
- } catch (ServiceException e) {
- return ERROR;
- }
- }
-
- public ArticleDetail getArticleDetail() {
- return articleDetail;
- }
-
- public boolean isDeleteAble() {
- return servicePerformer.check(deleteService);
- }
- }
<script type="text/javascript">render_code();</script> 注意,以上代码,仅表概念,并未精心设计. 供探讨. 引用 在 url 中可以分辩 /deleteArticle.do 这个操作,但是并不能分辩当前用户是否就是 articleId=123 这个帖子的作者.也就是说,如果不切入 Article 的 DomainObject 从 Article 中取出它的作者和当前用户进行比对, 那么,权限的判断肯定是难于进行的. 那么在 acegi 的方案中,对于这样的需求是怎么处理的呢? 1.acegi提供了可配置的voter,一个验证请求交由多个voter进行处理,已经提供了roleVoter.可以加入自定义的voter来处理. 2.什么是嵌入权限? 3.我想假如后台需要为多个前台,或者是未来的前台服务的时候,也才有必要引入这种复杂性. 我也是看看,没应用过,有什么不对之处,还望海涵. | 不管在是在service还是action加权限验证,实际是RBAC模块是可以分离的,我在去年的时候完成了这个模块,然后项目的时候只要把这个模块加进去就可以了。如果实际项目是可以通过url来控制权限的,那么就可以不用写一行代码。 在RBAC模块里完全可以做到很细的控制。 资源概念(可以是url,还有刚才看到有人说.do后面的参数那不到,参数当然可以拿的的,只不过url被切分成两部分而已,一部分就是参数.可以通过getQueryString得到) 资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限,而web项目 url的tree特别容易用来管理资源。资源是一棵树,如果你有管理树根的权限那么就有了这颗树的所有权限。 权限概念 权限是对资源的一种保护访问.用户要访问A资源前提是用户必须有A资源的访问权限. 角色概念 实事上我们不会直接把权限赋予给用户,而是通过角色来赋予给用户,因为用户拥有某一种权限是因为用户扮演着某一种角色。 A是个经理,他管理着B公司,他拥有b,c,d的权限。实际是不是A有这个权限,而是因为Abo是经理。因为经理拥有b,c,d权限 所以很显然在权限划分上,我们会把权限赋予给某一个角色,而不是赋予给个人。这样带来的好处是 如果公司换了经理,那么只要再聘用一个人来做经理就可以了,而不会出现因为权限在个人手里导致权限被带走的情况 分组概念(分组也是一棵树,用户就是这里的叶子) 只有角色是不够的,B公司发现A有财务问题成立了一个财务调查小组,然后我们赋予了这个小组财务调查员的角色(注意是赋予小组这个角色).这样这个小组的所有人员 都有财务调查的资格。而不需要给小组的每个人都赋予这个角色(实际上已经拥有了),分组概念也适合部门,因为任何一个部门在公司里或者社会上都在扮演着一个泛的角色。 用户 用户一定是属于某一个分组的,不存在不属于分组的用户.不过用户可以直接扮演(获得)角色,或者通过属于的分组来得到角色 最后一个概念 判断用户有没有访问资源的权限就看这个用户有没有访问这个资源的权限,也就是说分组,分部门,分角色最终是以权限来实现对资源的访问控制 | nihongye 写道 1.acegi提供了可配置的voter,一个验证请求交由多个voter进行处理,已经提供了roleVoter.可以加入自定义的voter来处理. 2.什么是嵌入权限? 3.我想假如后台需要为多个前台,或者是未来的前台服务的时候,也才有必要引入这种复杂性. 1.voter?在上述应用中,是否可以设想有一个voter,它所做的事情是否就是根据articleId从数据库取出article.author,与当前用户进行比对,如果相符就vote同意? 2.嵌入权限的意思就是,在系统设计之初不对权限做太多的设计,在系统的外部通过可配置的权限模块来给系统引入权限逻辑. 3.这个前台后台没有听太懂. 象上述作例子论坛这样的系统,没有特定的后台管理界面.版主,普通浏览者,匿名用户等等,所有用户都使用相同的界面.只是界面上显示的内容不同.比如,在一个看帖界面中,版主能看到删除链接,点击该链接能执行删除当前帖子的操作.但,匿名用户看不见删除链接,即使用户自己拼出删除链接,也不能执行删除操作. 继续探讨. | 1.是 2.同意. 3.后台和前台不是你说的意思.是指如: ServiceBeanA代表后台(相对稳定的一层). ActionC,ActionD,ActionE代表前台,或者URLC,URLD,URLE | |
相关推荐
### MVC通过反射获取...通过对MVC应用中的控制器和Action方法进行反射获取,我们可以轻松实现基于角色的权限管理,提高系统的安全性。此外,这种方法还具有很高的扩展性和灵活性,可以根据不同的业务需求进行调整。
Struts2是一个非常流行的Java Web框架,用于...通过学习这个文档,开发者可以了解到如何在实际项目中灵活运用Struts2的拦截器来实现高效且健壮的权限控制系统。这种能力对提升应用的安全性和用户体验有着显著的贡献。
ECSHOP的权限系统允许管理员细致地控制不同级别的管理员权限,确保了系统的稳定运行和数据安全。 ### 管理员权限概述 在ECSHOP中,后台管理员列表是权限系统的用户界面体现,通常使用admin账户登录后台可以看到...
通过以上分析,我们可以看出WEB应用数据权限控制是一个多层次、多技术融合的领域,它要求开发人员和系统架构师不仅要熟悉WEB技术栈和数据库操作,还要精通权限控制和安全管理。在实际开发过程中,还需要考虑到性能...
在Java开发中,权限访问控制系统是至关重要的一个部分,它确保了软件系统的安全性和稳定性。这个名为"java开发的权限访问控制系统.zip"的压缩包很可能包含了一个完整的Java实现的权限管理解决方案,用于管理和控制...
总的来说,权限管理是一个涉及用户、角色、权限和资源的复杂过程,通过精心设计的数据库结构和关联机制,可以构建出高效、灵活且安全的权限控制系统,以满足B/S系统的需求。在实际开发中,还需要结合具体业务逻辑和...
#### 背景与需求分析 在Web应用开发中,权限管理是一项重要的功能。很多情况下,应用程序需要确保只有经过身份验证的用户才能访问特定资源或执行某些操作。例如,在论坛系统中,只有登录用户才能发布主题、回复帖子...
在IT行业中,用户权限控制是系统安全的重要组成部分,它确保只有授权的用户才能访问特定的资源或执行特定的操作。这个“用户权限控制框架”项目记录着重于如何构建一个高效、安全且灵活的权限管理系统。 首先,我们...
权限管理系统是一种核心的企业级应用,它负责控制不同用户对系统资源的访问权限,确保数据安全和操作合规。在这个系统中,通常使用Struts2、Spring和JPA(Java Persistence API)与MySQL数据库相结合来实现。下面...
### 用户权限管理系统的设计与实现 #### 一、引言 随着信息技术的发展,特别是Java技术的广泛应用,基于J2EE架构的Web应用系统以其强大的可扩展性、灵活性和平台无关性等优势,在众多的企业级应用中得到了广泛的...
总的来说,B/S系统的权限设计与实现涉及多个层面,包括需求分析、数据库设计、关联表的使用等。一个完善的权限系统不仅能够保护系统安全,还应具备易用性和可扩展性,以适应不断变化的业务需求。在实际开发中,设计...
通过对权限管理系统的需求分析和数据库设计,我们可以实现一个完善的权限管理系统,满足大部分 B/S 系统中对用户功能权限控制的需求。 首先,我们需要了解为什么 B/S 系统中的权限管理更加重要。在 C/S 系统中,...
在权限系统中,action 表扮演着核心的角色,记录了系统中所有的动作,并将其与对应的分栏和组关联起来。 权限分栏表(actioncolumn) 权限分栏表(actioncolumn)用于记录动作的分栏,系统运行时,左侧菜单栏提供...
在设计B/S系统的用户权限管理时,数据结构的分析与设计是至关重要的。用户权限管理是确保系统安全、高效运行的基础,特别是在B/S架构中,由于浏览器作为通用客户端的特性,权限控制显得尤为关键,防止未经授权的用户...
功能通常与系统模块或页面的特定操作相对应,便于权限分配和控制。 4. 用户角色授权:这是权限管理的核心,将用户与角色关联,间接地赋予用户相应的功能权限。系统中可能存在多对多的关系,即一个用户可以拥有多个...
在IT行业中,访问控制列表(Access Control List,简称ACL)是一种常见的权限管理机制,用于定义哪些用户或系统实体可以访问特定资源。在这个“acl.zip_ACL_权限控制”的压缩包中,我们有四个PHP文件:p2.php、acl_1...
与传统的客户端/服务器(C/S)系统相比,B/S系统的开放性和易访问性意味着必须有更为严谨的权限控制机制来保障系统的安全性和数据的完整性。本文将深入探讨如何设计并实现一套灵活、高效、可扩展的权限管理Solution...
Java SSH框架权限管理系统是一款基于Java技术的,使用Struts、Spring和Hibernate三个开源框架整合开发的权限管理解决...通过分析和理解这个系统,开发者可以学习到如何在Java环境中有效地实现权限管理和应用架构设计。
总的来说,Abis权限管理系统源码的分析和学习,可以帮助我们理解权限管理的实现原理,提升在企业级应用开发中的安全控制能力。通过深入研究源码,我们可以学习到如何设计和实现一个功能强大、安全可靠的权限管理系统...