资源预览内容
第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
第9页 / 共57页
第10页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
本章内容:n Acegi安全系统介绍n 使用Servlet过滤器保护Web应用系统n 基于数据库或LDAP进行身份认证n 透明地对方法调用进行保护11.1 Acegi安全系统介绍Acegi是一个能够为基于Spring的应用系统提供描述性安全保护的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring对依赖注入和面向切面编程的支持。当保护Web应用系统时,Acegi使用Servlet过滤器来拦截Servlet请求,以实施身份认证并强制安全性。并且,在第11.4.1节你将会看到,Acegi采取了一种独特的机制来声明Servlet过滤器,使你可以使用Spring IoC注入它所依赖的其他对象。Acegi也能够通过保护方法调用在更底层的级别上强制安全性。使用Spring AOP,Acegi代理对象,将“切面”应用于对象,以确保用户只有在拥有恰当授权时才能调用受保护的方法。无论你正在保护一个Web应用程序还是需要方法调用级别的安全性,Acegi都是使用如图11.1所示的4个主要组件来实施安全性。图11.1 Acegi安全的基本组件通过本章,我们会揭示每一个组件的细节。但在开始考察Acegi安全机制的本质之前,首先让我们居高临下地考察一下每个组件扮演的角色。11.1.1 安全拦截器为了释放锁舌并打开门,你必须先把钥匙插到锁孔中,并恰当地拨动锁的制栓。如果钥匙和锁不匹配,就无法拨动制栓并释放锁舌。但如果你有正确的钥匙,所有的制栓就会接受这把钥匙,锁舌就会释放,从而允许你把门打开。在Acegi中,可以认为安全拦截器像一把锁的锁舌,能够阻止对应用系统中受保护资源的访问。为了释放“锁舌”并通过安全拦截器,你必须向系统提供“钥匙”(通常是一对用户名和密码)。“钥匙”会尝试拨开安全拦截器的“制栓”,从而允许你访问受保护的资源。11.1.2 认证管理器第一道必须打开的安全拦截器的制栓是认证管理器。认证管理器负责决定你是谁。它是通过考虑你的主体(通常是一个用户名)和你的凭证(通常是一个密码)做到这点的。你的主体定义了你是谁,你的凭证是确认你身份的证据。如果你的凭证足以使认证管理器相信你的主体可以标识你的身份,Acegi就能知道它在和谁打交道。11.1.3 访问决策管理器一旦Acegi决定了你是谁,它就必须决定你是否拥有访问受保护的资源的恰当授权。访问决策管理器是Acegi锁中第二道必须被打开的制栓。访问决策管理器进行授权,通过考虑你的身份认证信息和与受保护资源关联的安全属性决定是否让你进入。例如,安全规则也许规定只有主管才允许访问某个受保护资源。如果你被授予主管权限,则第二道也是最后一道制栓访问决策管理器会被打开,并且安全拦截器会给你让路,让你取得受保护资源的访问权。11.1.4 运行身份管理器当你通过认证管理器和访问决策管理器,安全拦截器会被开启,门已经可以被打开。但在你转动门把手进入之前,安全拦截器也许还有一件事要做。即使你已经通过身份认证并且已经获得了访问被保护资源的授权,门后也许还有更多的安全限制在等着你。比如,你也许已被授权访问查看某个Web页面,但用于创建该页面的对象也许和页面本身有不同的安全需求。一个运行身份管理器可以用另一个身份替换你的身份,从而允许你访问应用系统内部更深处的受保护对象。运行身份管理器的用处在大多数应用系统中是有限的。幸运的是,当你使用Acegi保护应用系统时可以不必使用甚至不必完全理解运行身份管理器。因此,我们认为运行身份管理器是一个高级课题,在下文中不再深入地探讨它。现在,你已经看到了Acegi安全性的全貌,让我们回过头来看一下如何配置Acegi安全系统的每一个部分,首先由认证管理器开始。11.2 管理身份验证决定是否允许用户访问受保护资源的第一步是判断用户的身份。在大多数应用系统中,这意味着用户在一个登录屏上提供用户名和密码。用户名(或者主体)告诉应用系统用户声明自己是谁。为了确证用户的身份,用户需要同时提供一个密码(或凭证)。如果应用系统的安全机制确认密码是正确的,则系统假设用户的实际身份与他声明的身份相同。在Acegi中,是由认证管理器负责确定用户身份的。一个认证管理器由接口net.sf.acegisecurity.AuthenticationManager定义: public interface AuthenticationManager public Authentication authenticate(Authentication authentication) throws AuthenticationException; 认证管理器的authenticate()方法需要一个net.sf.acegisecurity.Authentication对象(其中可能只包括用户名和密码)作为参数,它会尝试验证用户身份。如果认证成功,authenticate()方法返回一个完整的Authentication对象,其中包括用户已被授予的权限(将由授权管理器使用)。如果认证失败,则它会抛出一个AuthenticationException。正如你所见到的,AuthenticationManager接口非常简单,而且你可以相当容易地实现自己的AuthenticationManager。但是Acegi提供了ProviderManager,作为AuthenticationManager的一个适用于大多数情形的实现。所以,我们不讨论开发自己的认证管理器,而是看一下如何使用ProviderManager。11.2.1 配置ProviderManagerProviderManager是认证管理器的一个实现,它将验证身份的责任委托给一个或多个认证提供者,如图11.2所示。图11.2 ProviderManager将身份验证的职责委托给一个或多个认证提供者ProviderManager的思路是使你能够根据多个身份管理源来认证用户。它不是依靠自己实现身份验证,而是逐一遍历一个认证提供者的集合,直到某一个认证提供者能够成功地验证该用户的身份(或者已经尝试完了该集合中所有的认证提供者)。你可以在Spring配置文件中按如下方式配置一个ProviderManager: 通过providers属性可以为ProviderManager提供一个认证提供者的列表。通常你只需要一个认证提供者,但在某些情况下,提供由若干个认证提供者组成的列表是有用的。在这种情况下,如果一个认证提供者验证身份失败,可以尝试另一个认证提供者。一个认证提供者是由net.sf.acegisecurity.provider.AuthenticationProvider接口定义的。Spring提供了若干个AuthenticationProvider的有用实现,如下表所列:表11.1 Acegi选择的认证提供者认证提供者目 的net.sf.acegisecurity.adapters.AuthByAdapterProvider使用容器的适配器验证身份。net.sf.acegisecurity.providers.cas.CasAuthenticationProvider根据Yale中心认证服务验证身份。net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider从数据库中获取用户信息,包括用户名和密码。net.sf.acegisecurity.providers.jaas.JaasAuthenticationProvider从JAAS登录配置中获取用户信息。net.sf.acegisecurity.providers.dao.PasswordDaoAuthenticationProvider从数据库中获取用户信息,但让底层的数据源完成实际的身份验证。net.sf.acegisecurity.providers.rcp.RemoteAuthenticationProvider根据远程服务验证用户身份。net.sf.acegisecurity.runas.RunAsImplAuthenticationProvider针对身份已经被运行身份管理器替换的用户进行认证。net.sf.acegisecurity.providers.TestingAuthenticationProvider用于单元测试。自动认为一个TestingAuthenticationToken是有效的。不应用于生产环境。你可以认为一个AuthenticationProvider是一个下属的AuthenticationManager。事实上,AuthenticationProvider接口也有一个authenticate()方法,该方法的签名与AuthenticationManager的authenticate()方法完全一样。在本节中,我们关注表11.1中列出的三个最常用的认证提供者。首先从使用DaoAuthenticationProvider进行简单的基于数据库验证身份开始。11.2.2 根据数据库验证身份大多数应用系统将包括用户名和密码在内的用户信息保存在数据库中。如果这和你的情况相符,则你会发现Acegi提供的以下两个认证提供者是有用的:n DaoAuthenticationProvider;n PasswordDaoAuthenticationProvider。这两个认证提供者都能使你通过将用户的主体和密码与数据库记录进行比较来验证用户身份。两者的不同之处在于真正的身份验证是在哪里进行的。DaoAuthenticationProvider使用Dao来获取用户名和密码,并使用它们来验证用户身份。而PasswordDaoAuthenticationProvider将身份验证的责任推给Dao自己完成。这是一个重要的区别,等到我们在11.2.3节中讨论PasswordDaoAuthenticationProvider时,这个区别会变得更清楚。在本节中,我们看一下如何使用DaoAuthenticationProvider根据保存在某个数据源(通常是关系数据库)中的用户信息进行简单的身份验证。在下一节中你将看到如何使用PasswordDaoAuthenticationProvider根据一个LDAP(轻型目录访问协议)用户库进行身份验证。声明一个DAO认证提供者一个DaoAuthenticationProvider是一个简单的认证提供者,它使用DAO来从数据库中获取用户信息(包括用户的密码)。取得了用户名和密码之后,DaoAuthenticationProvider通过比较从数据库中获取的用户名和密码以及来自认证管理器的通过Authentication对象
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号