首页 > 图灵资讯 > 技术篇>正文

acegi授权策略和保护web资源

2023-04-19 16:11:14

  在通过各种认证方式获得Authentication认证对象后,事情的发展还没有结束。用户认证只是为了确定当前用户是否存在,她的身份也得到了认可。至于已认证的用户是否有权控制目标资源(网络资源、业务方法、领域对象),它还需要通过用户授权的测试!

  总的来说,acegi是如何实施用户授权的,以及围绕web资源的授权操作!

  当acegi完成用户认证操作时,认证结果将存储在authentication对象中。在不同的场合,Acegi内置了多种Authentication对象类型。比如:PrincipalAcegiUserToken,UsernamePasswordAuthenticationToken,X509Authenticationtoken等,他们必须实现Authentication接口!

  那么acegi是如何实施用户授权的呢?当已认证的用户视图通过角色集控制目标资源时,acegi内置的AOP拦截器将采用公平投票机制进行评估。事实上,公平投票贯穿于目标资源的调用前后。调用前,AOP拦截器确保当前用户的角色集中有符合要求的角色(符合要求的角色,即有权访问目标资源的角色);调用后,AOP拦截器将审查操作结果,例如从返回的领域对象集中删除当前用户无法控制的领域对象!

  拦截器在实施用户授权的过程中起着重要的作用。例如,Filtersecurityinterceptor是一种针对web资源的过滤器;Methodsecurityinterceptor是AOP拦截器,授权业务方法;AspectJsecurityinterceptor拦截器,用户授权真正调用AspectJ方法!

  这些拦截器分为三个阶段:事前评估、资源控制、事后审查!事前评估:

  以下配置信息,其中accessdecisionmanager属性正在完成预评估! PATTERN_TYPE_APACHE_ANT /securedpage.jsp=ROLE_ADMIN /login.jsp=ROLE_ADMIN,ROLE_USER /index.jsp=ROLE_ANONYMOUS

  上述httprequestacesdecisionmanager的定义如下,开发者需要为affirmativebased配置多个投票器(AccessDecisionVoter)

  Affirmativebased是Accesdecisionmanager的子类,以及Consensusbased,UnanimousBased。它们的含义和使用是不同的!

  AccesdecisionManager采用民主决策机制来判断用户是否有权访问目标程序资源,包括多个AccesdecisionVoter。每个Accesdecisionvoter在访问决策时都有投票权,Accesdecisionmanager统计投票结果,并根据某种决策方式决定是否最终向用户开放有限的资源访问。Acegi的投票方式有很多种,每个Voter都可以赞成访问权(ACCESS_GRANTED,取值为1),弃权(ACCESS_ABSTAIN,值为0)或反对(ACCESS_DENIED,取值为-1)!

  Acegi提供了三个特定的类别来管理投票结果,它们之间的区别存在于投票结果的统计数据中。Consensusbased类根据非弃权票中的赞成票多于反对票来决定是否通过。如果赞成票多于反对票,则同意通过!当同意和反对票相同或投弃权票时,授权可根据设置确定。配置如下:

  其中,属性alllowifalabstaindecisions的默认值是false,这意味着当配置的投票器只投弃权票时,不允许继续执行。相比之下,true意味着允许所有人投弃权票!

  allowIfEqualGrantedDeniedDecisions,默认值为true,即赞成票不为0,赞成票等于反对票,允许通过!false意味着赞成票不是0 在这种情况下,赞成票等于反对票,不允许通过!

  只要AffirmativeBased类有一个或多个投票赞成,它就会被批准。同样,我们可以在投弃权票时设置是否通过:

  UnanimousBased类在所有非弃权票投赞成票时都会通过,同样的设置也会出现在投弃权票时:

  Acegi为AccessdecisionVoter提供了两个实现类。对于Rolevoter,我们需要配置它的rolePrefix属性(如Role_)。当configAttribute从rolePrefix开始时,Rolevoter只会投票,否则会放弃投票权(ACCESS_ABSTAIN)。开始投票时,如果有一个或多个ConfigAtributes完全匹配被访资源的GrantedAuthority,则投票赞成票,否则投票反对票

  Acegi内置各种投票器,用户授权web资源、业务方法和领域对象!其中,Rolevoter主要针对web资源和业务方法,Aclentryvoter主要针对领域对象!如何使用,将在下一章中使用! 事后审查:

  一旦用户控制了目标资源,调用结果可能会返回一个领域的对象集合,例如,getAll()方法将返回所有对象集合!但并非所有用户都能操作任何领域的对象,我们需要保护它们!

  实施领域的对象级Acegi的AfterinvocationManager在访问控制(事后审查)中扮演着非常重要的角色! sample.contact.ContactManager.create=ROLE_USER sample.contact.ContactManager.getAllRecipients=ROLE_USER sample.contact.ContactManager.getAll=ROLE_USER,AFTER_ACL_COLLECTION_READ sample.contact.ContactManager.getById=ROLE_USER,AFTER_ACL_READ sample.contact.ContactManager.delete=ACL_CONTACT_DELETE sample.contact.ContactManager.deletePermission=ACL_CONTACT_ADMIN sample.contact.ContactManager.addPermission=ACL_CONTACT_ADMIN

  Afterinvocationmanager将审查业务对象的操作结果,例如操作结果是否包含当前用户无权操作的领域对象。如果是这样,Afterinvocationmanager将从操作结果中删除该领域的对象!到底发生了什么事?我稍后再谈。

  保护web资源:FilterSecurityInterceptor

  重新认证:

  用户一旦登录到目标系统,就会根据自己的原始身份进行各种操作,但在某些情况下,用户的身份可能会发生动态变化!为了将RDBMS中角色的信息变化同步到已登录的用户中,必须使用alwaysreauthenticate属性,默认值为false: ...

  Rolevoter投票器:

  对于Rolevoter,默认情况下,我们只会投票处理前缀为Role_的角色,吐出角色信息,不使用Role_开头。我们需要配置它的RolePrefix属性。当ConfigAtribute从RolePrefix开始时,Rolevoter会投票,否则会放弃投票权(ACCESS_ABSTAIN)。开始投票时,如果有一个或多个ConfigAtributes完全匹配被访资源的GrantedAuthority,则投票赞成票,否则投票反对票

  开发人员配置的每个角色都必须有相应的投票器来处理,否则目标Acegi应用程序无法正常启动!除非validateconfigattributes属性被显式地放置为false。但建议将其设置为true! ...

  在RDBMS中存储web资源授权信息:

  分析Filterinvocationdefinfitionsource的运行: CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /index.jsp=ROLE_ANONYMOUS,ROLE_USER /hello.htm=ROLE_ANONYMOUS,ROLE_USER /logoff.jsp=ROLE_ANONYMOUS,ROLE_USER /acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER /**=ROLE_USER

  其中objectdefinitionsource属性属于filterinvocationdefinfitionsource类型!

  PATTERN_TYPE_APACHE_ANT:apache启用 ant路径风格的url匹配模式(PathBasedFilterInvocationDefinfitionMap),默认是正则表达式(RegExpBasedFilterInvocationDefinfitionMap),他们都是Filterinvocationdefinfitionsource的子类!为了通过DBMS维护web资源授权信息,必须自行提供filterinvocationdefiniftionsource子类!基于DBMS的FilterinvocationdefiniftionSource

  工程目录结构及所需jar包如下:

  1.建表:

  --在数据库中配置web资源更加灵活 table web_resource( web_id number not null primary key, web_url varchar2(60) not null, web_role varchar2(100) not null);

上一篇 高效率优化Oracle SQL
下一篇 机器人视觉系统分为哪几种,主要包括哪些关键技术?

文章素材均来源于网络,如有侵权,请联系管理员删除。