关于alfresco代码跟踪之security服务_第1页
关于alfresco代码跟踪之security服务_第2页
关于alfresco代码跟踪之security服务_第3页
关于alfresco代码跟踪之security服务_第4页
关于alfresco代码跟踪之security服务_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 安全的实现安全wiki/wiki/security_and_authentication安全的保证时机是在调用public services的时候实施的,访问控制是通过元数据而不是硬编码实现的,就是通过使用acegi和aop实现的。安全控制可以基于 :方法访问;提供给方法的参数;以及调用方法返回值。安全是通过一下五个关键服务完成的。the authentication service、the authority service、the ownable service、the permission service、the person servi

2、ce。访问控制通过检查当前用户授予的authority所拥有的permission和permission group允许或者禁止人员执行操作一个特定对象的方法。例如nodeservice bean readproperties方法在调用方法之前检查当前用户是否有读当前节点的属性的访问权限。在searchservice服务中,查询的结果值返回用户有read permission权限的节点(对返回结果进行过滤)。对公共服务的访问控制定义在 public-services-context.xml,每个服务都定义一个方法interceptor bean实现对方法调用的安全控制,通常这些定义在publi

3、c-services-security-context.xml。1.1 定义方法级别的安全在public-services-security-context.xml 中定义了支持基于acegi的security around method invocation。这个配置了两个alfresco特定的bean:一个voter可以基于对于当前操作参数授予当前用户的permission的方法调用,一个after invocation provider用来为返回值加上安全。方法访问按照普通的acegi方式定义,但是附加一些内容。一下?代表authority,#代表方法参数索引 *前置判断是如下形式:ac

4、l_method.? access to the method is restricted to those with the given authority in alfresco. this could be a user name or group. dynamic authorities are not supported acl_node.#.* access control is restricted to users who have the the specified permission for the node on the identified argument. if

5、the argument is a noderef it will be used; if it is a storeref then the root node for the store will be used; if it is a childassociationref then the child node will be used. acl_parent.#.* access control is restricted to users who have the the specified permission for the parent of the node on the

6、identified argument. if the argument is a noderef the parent of the node will be used; if it is a childassociationref then the parent node will be used. role_. check for an acegi authority starting with role_ group_. check for an acegi authority starting with group_ if more than one acl_node.#.* or

7、acl_parent.#.* entry is present then all the permissions must be available for the method to execute. 后置判断采取如下形式:after_acl_node.* similar to acl_node.#.* but the restriction applies to the return argument. the supported return types are childassociationref, fileinfo, noderef, storeref, resultset; co

8、llections and arrays of storeref, noderef, childassociationref, and fileinfo. after_acl_parent.* similar to acl_parent.#.* but the restriction applies to the return argument. the supported return types are childassociationref, fileinfo, noderef, storeref, resultset; collections and arrays of storere

9、f, noderef, childassociationref, and fileinfo. 2 authentication服务。1. alfresco把认证了的用户信息acegi的authentication对象放入当前线程,这样就不用在认证了。在认证之后会返回给客户端一个ticket,每次调用的时候只需要和当前线程的authentication进行比较,不需要在进行认证一次浪费资源;如果当前线程没有authentication信息的时候才会调用认证组件进行认证;2. 对于用户authentication信息以及生成的ticket信息都会放入缓存中,ticket是根据用户名以及一些其他的用

10、户信息生成的,这样保证不会url假冒;3. 如果对authentication是怎么存在线程里面不理解的,可以参考acegi的context以及contextholder部分;4. 由于很多操作,对与当前线程绑定的authentication人来说是无权做的,所以要更改authentication信息,从而使用具有更高权限的人来做,这个就是 string currentuser = authenticationutil.getrunasuser();authenticationutil.setrunasuser(currentuser);的用处,如果不理解,可以看看acegirunasmana

11、ger一部分内容。2.1 子系统说明从alfresco3开始认证部分是用来subsystem(子系统)的概念,认证系统是由子系统完成的。在alfresco中由于安全部分使用了acegi,所以认证的处理也包含两部分内容,一部分是用于提供acegi的authenticationmanager,另外一部分就是认证服务的接口authenticationservice,这两部分的底层代码相同,都是使用了subsystem。但是subsystem的实现不同,authenticationservice使用了 localauthenticationservice 属性指名了使用localauthenticat

12、ionservice,这个从repository库进行认证。而在authenticationdao中(用于acegi的authenticationmanager)没有配置sourcebeanname属性,这是因为在经过authenticationservice认证后,在acegi安全判断的过程就不需要认证了。2.2 总图2.3 关于authenticationservice2.3.1 用户登录 这部分使用jsp页面来完成的,用户进入系统后的首页为context/index.jsp。/ get the start location as configured by the web-client

13、configwebapplicationcontext context = webapplicationcontextutils.getrequiredwebapplicationcontext(session.getservletcontext();configservice configservice = (configservice)context.getbean(webclientconfigservice);clientconfigelement configelement = (clientconfigelement)configservice.getglobalconfig().

14、getconfigelement(client);string location = configelement.getinitiallocation();authenticationservice authservice = (authenticationservice)context.getbean(authenticationservice);/ override with the users preference if they have oneuser user = (user)session.getattribute(authenticationhelper.authenticat

15、ion_user);if (user != null) usertransaction tx = (transactionservice)context.getbean(transactionservice).getusertransaction(); tx.begin();try authservice.validate(user.getticket(); / ensure construction of the facescontext before attemping a service call facescontext fc = faceshelper.getfacescontext

16、(request, response, application); string preference = (string)preferencesservice.getpreferences(fc).getvalue(start-location); if (preference != null) location = preference; mit(); catch (authenticationexception autherr) try tx.rollback(); catch (throwable tex) / expired ticket authenticationse

17、rvice unpauth = (authenticationservice)context.getbean(authenticationservice); unpauth.invalidateticket(unpauth.getcurrentticket(); unpauth.clearcurrentsecuritycontext(); catch (throwable e) try tx.rollback(); catch (throwable tex) elseusertransaction tx = (transactionservice)context.getbean(transac

18、tionservice).getusertransaction(); tx.begin();try authservice.authenticateasguest();personservice personservice = (personservice)context.getbean(personservice); noderef guestref = personservice.getperson(permissionservice.guest_authority); user = new user(authservice.getcurrentusername(), authservic

19、e.getcurrentticket(), guestref); session.setattribute(authenticationhelper.authentication_user, user); / ensure construction of the facescontext before attemping a service call facescontext fc = faceshelper.getfacescontext(request, response, application); string preference = (string)preferencesservi

20、ce.getpreferences(session).getvalue(start-location); if (preference != null) location = preference; session.removeattribute(authenticationhelper.authentication_user); mit(); catch (throwable e) try tx.rollback(); catch (throwable tex) if (request.getmethod().equalsignorecase(get) if (navigatio

21、nbean.location_myalfresco.equals(location) / clear previous location - fixes the issue adb-61 facescontext fc = faceshelper.getfacescontext(request, response, application); if (fc != null) navigationbean navigationbean = (navigationbean)faceshelper.getmanagedbean(fc, navigationbean); if (navigationb

22、ean != null) navigationbean.setlocation(null); navigationbean.settoolbarlocation(null); / send redirect response.sendredirect(request.getcontextpath() + /faces/jsp/dashboards/container.jsp); else response.sendredirect(request.getcontextpath() + /faces/jsp/browse/browse.jsp); / route webdav requestse

23、lse if (request.getmethod().equalsignorecase(propfind) | request.getmethod().equalsignorecase(options) response.sendredirect(request.getcontextpath() + /webdav/);这段代码不难理解了就是获取到公共服务的authenticationservice authservice = (authenticationservice)context.getbean(authenticationservice);注意这里bean的名字是大写” authe

24、nticationservice”,这个bean的定义位于public-service-context.xml,是一个公共服务。因为这个服务是使用了aop对authenticationservice服务(定义在authentication-context.xml中)的封装2.3.2 公共服务定义公共服务定义如下:位于配置文件public- services -context.xml org.alfresco.service.cmr.security.authenticationservice 2.3.3 关于目标target这个步骤是使用配置服务读取webclient的配置信息决定哪些文件支持

25、在线编辑。配置文件位于authentication-services-context.xml。 localauthenticationservice 这里使用了子系统subsystemchainingauthenticationservice,这里的applicationcontextmanager为authentication。认证接口有3个实现,一个是基本的实现,另外一个是对基本实现的链式包装,第三个就是使用链式子系统对认证进行包装。这个链式子系统在提供更改认证的方法的时候就是使用sourcebeanname配置的bean名字也就是名字为localauthenticationservice

26、的bean配置的实现。对于链式认证则包含localauthenticationservice于其它配置的bean。默认使用的是alfrescontlm下的localauthenticationservice,其实使用的就是存储库进行认证。2.3.4 截断器 authenticationservice_transaction事物截断器,很好理解了。定义如下:位于配置文件public- services -context.xml propagation_not_supported, readonly propagation_not_supported, readonly propag

27、ation_not_supported, readonly propagation_not_supported, readonly propagation_not_supported, readonly propagation_not_supported, readonly $server.transaction.mode.default auditmethodinterceptor审计追踪截断器,也很好理解了。定义如下:位于配置文件public-service-context.xml false exceptiontranslator异常处理截断器,也很好理解

28、了。定义如下:位于配置文件public- services -context.xml false authenticationservice_security这个截断器类使用的是ercept.method.aopalliance.methodsecurityinterceptor这个截断器,如果不懂可以看acegi的文档,这个截断器是acegi的安全截断器,用到了authenticationmanager、accessdecisionmanager、afterinvocationmanager等所有构成安全部分的组件。因为在认证服

29、务中不仅是包含了获取用户认证信息的操作,还包括了创建认证、更新认证、设置认证、删除深证、封禁/解禁认证、等这些只有管理员才能做的操作,所以这个截断器是保证这些操作只有acl_method.role_administrator权限的人才能操作。定义如下:位于配置文件public-services-security-context.xml org.alfresco.service.cmr.security.authenticationservice.createauthentication=acl_method.role_administrator org.alfresco.service.cmr

30、.security.authenticationservice.updateauthentication=acl_allow org.alfresco.service.cmr.security.authenticationservice.setauthentication=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.deleteauthentication=acl_method.role_administrator org.alfresco.service.cmr.s

31、ecurity.authenticationservice.setauthenticationenabled=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.getauthenticationenabled=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.authenticationexists=acl_method.role_administrat

32、or org.alfresco.service.cmr.security.authenticationservice.getcurrentusername=acl_allow org.alfresco.service.cmr.security.authenticationservice.invalidateusersession=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.invalidateticket=acl_allow org.alfresco.service.

33、cmr.security.authenticationservice.getcurrentticket=acl_allow org.alfresco.service.cmr.security.authenticationservice.clearcurrentsecuritycontext=acl_allow org.alfresco.service.cmr.security.authenticationservice.iscurrentuserthesystemuser=acl_allow org.alfresco.service.cmr.security.authenticationser

34、vice.guestuserauthenticationallowed=acl_allow org.alfresco.service.cmr.security.authenticationservice.getdomains=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.getdomainsthatallowusercreation=acl_method.role_administrator org.alfresco.service.cmr.security.authe

35、nticationservice.getdomainsthatallowuserdeletion=acl_method.role_administrator org.alfresco.service.cmr.security.authenticationservice.getdomiansthatallowuserpasswordchanges=acl_method.role_administrator 2.4 关于acegi authenticationmanager2.4.1 配置文件位于authentication-services-context.xml 类net.sf

36、.viders.providermanageracegi的标准类了。 authenticatedauthenticationpassthroughprovideran authentication provider that just believes authentications bound to the local thread are valid if they are set as authenticated。authenticatedauthenticationpassthroughprovider,代码很简单了,就是直接通过认证。位

37、于authentication-services-context.xml daoauthenticationprovideracegi的daoauthenticationprovider。易用了authenticationdao,参见authenticationdao。位于authentication-services-context.xml 关于accessdecisionmanager 关于afterinvocationmanager2.4.2 authenticationdaoacegi对认证链的支持是通过一个authenticationman

38、ager管理多个authenticationprovider实现的,但是alfresco对它进行了扩展,使得daoauthenticationprovider本身也支持认证连管理。定义位于authentication-services-context.xml org.alfresco.repo.security.authentication.mutableauthenticationdao 可以看到这个dao就支持链式认证,这个bean的类为org.alfresco.repo.management.subsystems.chainingsubsystemproxyfactory,这个类是一个工

39、厂类,这个类与childapplicationcontextmanager类允许特定的接口代理给子应用环境链。它是采用以下方法决定一个特殊的方法调用的目标的,返回的代理会按照顺序搜索应用环境链并且选择第一个具有必须得方法名或者没有实现activatablebean接口,或者那些目标是链中特殊成语的函数。详见链式子系统。 对于applicationcontextmanager bean的配置如下: $authentication.chain 这个bean的实现为defaultchildapplicationcontextmanager类,提供的defaultchain配置位于repository

40、.properties,为authentication.chain=alfrescontlm1:alfrescontlm。这个authentication manager包含了两个applicationcontextfactory对应了两中认证子系统环境分别是alfrescontlm1和alfrescontlm。在alfresco 3.1版本中实现了如下的认证子系统:alfresco、alfrescontlm、kerberos、ldap、passthru等,配置文件位于alfrescosubsystemsauthentication中。2.4.3 saltsource2.4.4 passwordencoder2.5 applicationcontextmanager之authentication配置文件位于authentication

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论