Acegi框架介绍

【IT168 专稿】对于任何一个完整的应用系统,完善的 认证和授权机制是必不可少的。Acegi Security(以下简称Acegi)是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架,Acegi已经成为 Spring官方的一个子项目,所以也称为Spring Security。它通过在Spring容器中配置一组Bean,充分利用Spring的IoC和AOP功能,提供声明式安全访问控制的功能。虽然,现在 Acegi也可以应用到非Spring的应用程序中,但在Spring中使用Acegi是最自然的方式。
Acegi可以实现业务对象方法级的安全访问控制粒度,它提供了以下三方面的应用程序的安全:

? URL资源的访问控制
    如所有用户(包括其名用户)可以访问index.jsp登录页面,而只有授权的用户可以访问/user/addUser.jsp页面。Acegi允许通过正则表达式或Ant风格的路径表达式定义URL模式,让授权用户访问某一URL匹配模式下的对应URL资源。

? 业务类方法的访问控制
    Spring容器中所有Bean的方法都可以被Acegi管理,如所有用户可以调用BbtForum#getRefinedTopicCount()方法,而只有授权用户可以调用BbtForum#addTopic()方法。

? 领域对象的访问控制
    业务类方法代表一个具体的业务操作,比如更改、删除、审批等,业务类方法访问控制解决了用户是否有调用某种操作的权限,但并未对操作的客体(领域对象)进 行控制。对于我们的论坛应用来说,用户可以调用BbtForum#updateUser(User user)方法更改用户注册信息,但应该仅限于更改自己的用户信息,也即调用BbtForum#updateUser()所操作的User这个领域对象必 须是受限的。

    Acegi通过多个不同用途的Servlet过滤器对URL资源进行保护,在请求受保护的URL资源前,Acegi的Servlet过滤器判断用户是否有权访问目标资源,授权者被开放访问,而未未被授权者将被阻挡在大门之外。
    Acegi通过Spring AOP对容器中Bean的受控方法进行拦截,当用户的请求引发调用Bean的受控方法时,Acegi的方法拦截器开始工作,阻止未授权者的调用。
    
    对领域对象的访问控制建立在对Bean方法保护的基础上,在最终开放目标Bean方法的执行前,Acegi将检查用户的ACL(Aeccess Control List:访问控制列表)是否包含正要进行操作的领域对象,只有领域对象被授权时,用户才可以使用Bean方法对领域对象进行处理。此外,Acegi还可 以对Bean方法返回的结果进行过滤,将一些不在当前用户访问权限范围内的领域对象剔除掉——即传统的数据可视域范围的控制。一般来说,使用Acegi控 制数据可视域未非理想的选择,相反通过传统的动态SQL的解决方案往往更加简单易行。

    从本质特性上来说,Servlet过滤器就是最原始的原生态AOP,所以我们可以说Acegi不但对业务类方法、领域对象访问控制采用了AOP技术方案, 对URL资源的访问控制也使用了AOP的技术方案。使用AOP技术方案的框架是令人振奋的,这意味着,开发者可以在应用程序业务功能开发完毕后,轻松地通 过Acegi给应用程序穿上安全保护的“铁布衫”。

Acegi体系结构
    乘飞机前需要通过安检,乘客必须提供身份证以验证其身份。在通过安检进入候机室后,国航、海航、南航等不同航空公司的飞机陆续到达,但你只能登上机票上对 应航班的飞机。在登机后,只能坐在机票对应的座位上——你不能抢占他人的座位,你不能在座位上刻字留念、你不能要求空姐打开机窗……

    乘飞机的过程最能体现安全控制的流程,我们可以从中找到身份认证、资源访问控制、领域对象安全控制的对应物:安检对应身份认证,登机对应资源访问控制而按号就座则对应领域对象安全控制。
    Acegi通过两个组件对象完成以上安全问题的处理:AuthenticationManager(认证管理器)、AccessDecisionManager(访问控制管理器),如图 1所示:

         图 1 Acegi体系结构

 SecurityContextHolder是框架级的容器,它保存着和所有用户关联SecurityContext实例, SecurityContext承载着用户(也称认证主体)的身份信息的权限信息, AuthenticationManager、AccessDecisionManager将据此进行安全访问控制。
   
    SecurityContext的认证主体安全信息在一个HTTP请求线程的多个调用之间是共享的(通过ThreadLocal),但它不能在多个请求之 间保持共享。为了解决这个问题,Acegi将认证主体安全信息缓存于HttpSession中,当用户请求一个受限的资源时,Acegi通过 HttpSessionContextIntegrationFilter将认证主体信息从HttpSession中加载到 SecurityContext实例中,认证主体关联的SecurityContext实例保存在Acegi容器级的 SecurityContextHolder里。当请求结束之后,HttpSessionContextIntegrationFilter执行相反的操 作,将SecurityContext中的认证主体安全信息重新转存到HttpSession中,然后从SecurityContextHolder中清 除对应的SecurityContext实例。通过HttpSession转存机制,用户的安全信息就可以在多个HTTP请求间共享,同时保证 SecurityContextHolder中仅保存当前有用的用户安全信息,其整体过程如图 2所示:

图 2 SecurityContext在HttpSession和请求线程间的转交过程

 

当用户请求一个受限的资源时,AuthenticationManager首先开始工作,它象一个安检入口,对用户身份进行核查,用户必须提供身份认证的 凭证(一般是用户名/密码)。在进行身份认证时,AuthenticationManager将身份认证的工作委托给多个 AuthenticationProvider。因为在具体的系统中,用户身份可能存储在不同的用户信息安全系统中(如数据库、CA中心、LDAP服务 器),不同用户信息安全系统需要不同的AuthenticationProvider执行诸如用户信息查询、用户身份判断、用户授权信息获取等工作。只要 有一个AuthenticationProvider可以识别用户的身份,AuthenticationManager就通过用户身份认证,并将用户的授 权信息放入到SecurityContext中。

   当用户通过身份认证后,试图访问某个受限的程序资源时,AccessDecisionManager开始工作。 AccessDecisionManager采用民主决策机制判断用户是否有权访问目标程序资源,它包含了多个AccessDecisionVoter。 在访问决策时每个AccessDecisionVoter都拥有投票权,AccessDecisionManager统计投票结果,并按照某种决策方式根 据这些投票结果决定最终是否向用户开放受限资源的访问。
、操作类都在这些组件类的基础上进行操作。在进入Acegi框架的具体学习前,有必要事先了解一下这些承载Acegi框架重要概念的组件类。
    首先,我们要接触是UserDetails接口,它代表一个应用系统的用户,该接口定义了用户安全相关的信息,如用户名/密码,用户是否有效等信息,你可以根据以下接口方法进行相关信息的获取:
    String getUsername():获取用户名;
     String getPassword():获取密码;
     boolean isAccountNonExpired():用户帐号是否过期;
     boolean isAccountNonLocked():用户帐号是否锁定;
    boolean isCredentialsNonExpired():用户的凭证是否过期;
    boolean isEnabled():用户是否处于激活状态。
    当以上任何一个判断用户状态的方法都返回false时,用户凭证就被视为无效。
    UserDetails还定义了获取用户权限信息的方法:GrantedAuthority[] getAuthorities(),GrantedAuthority代表用户权限信息,它定义了一个获取权限描述信息(以字符串表示,如 PRIV_COMMON)的方法:String getAuthority()。 当用户请求一个受限的资源时,AuthenticationManager首先开始工作,它象一个安检入口,对用户身份进行核查,用户必须提供身份认证的 凭证(一般是用户名/密码)。在进行身份认证时,AuthenticationManager将身份认证的工作委托给多个 AuthenticationProvider。因为在具体的系统中,用户身份可能存储在不同的用户信息安全系统中(如数据库、CA中心、LDAP服务 器),不同用户信息安全系统需要不同的AuthenticationProvider执行诸如用户信息查询、用户身份判断、用户授权信息获取等工作。只要 有一个AuthenticationProvider可以识别用户的身份,AuthenticationManager就通过用户身份认证,并将用户的授 权信息放入到SecurityContext中。

   当用户通过身份认证后,试图访问某个受限的程序资源时,AccessDecisionManager开始工作。 AccessDecisionManager采用民主决策机制判断用户是否有权访问目标程序资源,它包含了多个AccessDecisionVoter。 在访问决策时每个AccessDecisionVoter都拥有投票权,AccessDecisionManager统计投票结果,并按照某种决策方式根 据这些投票结果决定最终是否向用户开放受限资源的访问。
、操作类都在这些组件类的基础上进行操作。在进入Acegi框架的具体学习前,有必要事先了解一下这些承载Acegi框架重要概念的组件类。
    首先,我们要接触是UserDetails接口,它代表一个应用系统的用户,该接口定义了用户安全相关的信息,如用户名/密码,用户是否有效等信息,你可以根据以下接口方法进行相关信息的获取:
    String getUsername():获取用户名;
     String getPassword():获取密码;
     boolean isAccountNonExpired():用户帐号是否过期;
     boolean isAccountNonLocked():用户帐号是否锁定;
    boolean isCredentialsNonExpired():用户的凭证是否过期;
    boolean isEnabled():用户是否处于激活状态。
    当以上任何一个判断用户状态的方法都返回false时,用户凭证就被视为无效。
    UserDetails还定义了获取用户权限信息的方法:GrantedAuthority[] getAuthorities(),GrantedAuthority代表用户权限信息,它定义了一个获取权限描述信息(以字符串表示,如 PRIV_COMMON)的方法:String getAuthority()。 当用户请求一个受限的资源时,AuthenticationManager首先开始工作,它象一个安检入口,对用户身份进行核查,用户必须提供身份认证的 凭证(一般是用户名/密码)。在进行身份认证时,AuthenticationManager将身份认证的工作委托给多个 AuthenticationProvider。因为在具体的系统中,用户身份可能存储在不同的用户信息安全系统中(如数据库、CA中心、LDAP服务 器),不同用户信息安全系统需要不同的AuthenticationProvider执行诸如用户信息查询、用户身份判断、用户授权信息获取等工作。只要 有一个AuthenticationProvider可以识别用户的身份,AuthenticationManager就通过用户身份认证,并将用户的授 权信息放入到SecurityContext中。

   当用户通过身份认证后,试图访问某个受限的程序资源时,AccessDecisionManager开始工作。 AccessDecisionManager采用民主决策机制判断用户是否有权访问目标程序资源,它包含了多个AccessDecisionVoter。 在访问决策时每个AccessDecisionVoter都拥有投票权,AccessDecisionManager统计投票结果,并按照某种决策方式根 据这些投票结果决定最终是否向用户开放受限资源的访问。
、操作类都在这些组件类的基础上进行操作。在进入Acegi框架的具体学习前,有必要事先了解一下这些承载Acegi框架重要概念的组件类。
    首先,我们要接触是UserDetails接口,它代表一个应用系统的用户,该接口定义了用户安全相关的信息,如用户名/密码,用户是否有效等信息,你可以根据以下接口方法进行相关信息的获取:
    String getUsername():获取用户名;
     String getPassword():获取密码;
     boolean isAccountNonExpired():用户帐号是否过期;
     boolean isAccountNonLocked():用户帐号是否锁定;
    boolean isCredentialsNonExpired():用户的凭证是否过期;
    boolean isEnabled():用户是否处于激活状态。
    当以上任何一个判断用户状态的方法都返回false时,用户凭证就被视为无效。
    UserDetails还定义了获取用户权限信息的方法:GrantedAuthority[] getAuthorities(),GrantedAuthority代表用户权限信息,它定义了一个获取权限描述信息(以字符串表示,如 PRIV_COMMON)的方法:String getAuthority()。

当用户请求一个受限的资源时,AuthenticationManager首先开始工作,它象一个安检入口,对用户身份进行核查,用户必须提供身份认证的 凭证(一般是用户名/密码)。在进行身份认证时,AuthenticationManager将身份认证的工作委托给多个 AuthenticationProvider。因为在具体的系统中,用户身份可能存储在不同的用户信息安全系统中(如数据库、CA中心、LDAP服务 器),不同用户信息安全系统需要不同的AuthenticationProvider执行诸如用户信息查询、用户身份判断、用户授权信息获取等工作。只要 有一个AuthenticationProvider可以识别用户的身份,AuthenticationManager就通过用户身份认证,并将用户的授 权信息放入到SecurityContext中。

   当用户通过身份认证后,试图访问某个受限的程序资源时,AccessDecisionManager开始工作。 AccessDecisionManager采用民主决策机制判断用户是否有权访问目标程序资源,它包含了多个AccessDecisionVoter。 在访问决策时每个AccessDecisionVoter都拥有投票权,AccessDecisionManager统计投票结果,并按照某种决策方式根 据这些投票结果决定最终是否向用户开放受限资源的访问。
、操作类都在这些组件类的基础上进行操作。在进入Acegi框架的具体学习前,有必要事先了解一下这些承载Acegi框架重要概念的组件类。
    首先,我们要接触是UserDetails接口,它代表一个应用系统的用户,该接口定义了用户安全相关的信息,如用户名/密码,用户是否有效等信息,你可以根据以下接口方法进行相关信息的获取:
    String getUsername():获取用户名;
     String getPassword():获取密码;
     boolean isAccountNonExpired():用户帐号是否过期;
     boolean isAccountNonLocked():用户帐号是否锁定;
    boolean isCredentialsNonExpired():用户的凭证是否过期;
    boolean isEnabled():用户是否处于激活状态。
    当以上任何一个判断用户状态的方法都返回false时,用户凭证就被视为无效。
    UserDetails还定义了获取用户权限信息的方法:GrantedAuthority[] getAuthorities(),GrantedAuthority代表用户权限信息,它定义了一个获取权限描述信息(以字符串表示,如 PRIV_COMMON)的方法:String getAuthority()。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值