`
lengyun3566
  • 浏览: 446597 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:379171
社区版块
存档分类
最新评论

《Spring Security3》第六章第七部分翻译(认证事件处理与小结)

阅读更多

 

认证事件处理

         有一个重要的功能只能通过基于bean的配置就是自定义处理认证事件。认证事件使用了Spring的时间发布机制,它基于o.s.context.ApplicationEvent事件模型。Spring事件模型使用并不广泛,却能够很有用处——特别在认证系统中——如当你想绑定特定行为到认证领域的行动上去的时候。

         事件是典型的订阅-发布模式,通知订阅者是Spring运行环境自己处理的。比较重要的一点是,在默认情况下Spring的事件模型是同步的,所以有任何订阅监听的运行时会直接影响产生事件请求的性能。

         ApplicationContext初始化的时候,Spring将会检查所有配置的bean是否存在o.s.context.ApplicationListener接口。这些bean的引用将会被o.s.context.event.ApplicationEventMulticaster持有,它会在o.s.context.ApplicationEventPublisher发布事件时,管理运行时事件的发布。这个设施已经存在很长时间了(从Spring1.1),所以你若想更深入了解Spring的这个领域,有很多文档可查。

         下图阐述了事件发布流程是如何组织在一起的:




 因为在Spring Security内部没有广泛使用认证事件(实际上,唯一明显用的地方就是我们本章前面讨论的session并发跟踪),自定义认证事件的监听器是一种实现审计、管理报警甚至复杂用户行为追踪的便利方式。

         让我们了解一下配置简单安全事件监听的过程。

配置认证事件的监听器

         使用简短的security命名空间配置,你不能配置认证事件监听器——它必须使用基于Spring bean的方式因为ApplicationEventPublisher的实现类默认不会启用,必须织入到AuthenticationManager中。

声明需要的bean依赖

         我们首先声明ApplicationEventPublisher的实现类,如下:

 

<bean id="defaultAuthEventPublisher" 
  class="org.springframework.security.authentication .DefaultAuthenticationEventPublisher"/>

 接下来,我们将会把它织入到使用的AuthenticationManager中:

 

<bean id="customAuthenticationManager" 
  class="org.springframework.security.authentication.ProviderManager">
  <property name="authenticationEventPublisher" ref="defaultAuthEventPublisher"/>
  <property name="providers">
    <list>
      <ref local="daoAuthenticationProvider"/>
      <ref local="rememberMeAuthenticationProvider"/>
    </list>
  </property>
</bean>

 这就是全部需要的配置。如果此时你重启应用,你将会什么也看不到。这是因为我们还没有创建bean来监听发布的时间。现在,我们就做这件事。

构建自定义的应用事件监听器

         ApplicationListener的实现类很简单,并且使用Spring 3加入的强大Java泛型功能支持类型安全。我们的ApplicationListener只是简单记录收到的事件到标准输出中,但是在后面的练习中我们将会体验一个更有趣的例子。

         自定义的ApplicationListener如下:

 

package com.packtpub.springsecurity.security;
// imports omitted
  @Component
  public class CustomAuthenticationEventListener implements
    ApplicationListener<AbstractAuthenticationEvent> {
  @Override
  public void onApplicationEvent(AbstractAuthenticationEvent event) {
    System.out.println("Received event of type: 
      "+event.getClass().getName()+": "+event.toString());
  }
}

 你会发现我们这里使用了@Component注解,但是我们也可以在XML配置文件中简单声明一个Spring bean

         记住,ApplicationListener的实现类必须注明对什么类型的事件感兴趣,在Spring 3中通过在ApplicationListener接口引用中声明泛型来标注。SpringApplicationEventMulticaster使用一些巧妙的方法来检查类的接口实现声明并确保正确的事件到达正确的类中。

【巧妙的注解。你如果对复杂的注解处理和运行时检查注解感到好奇,毫无疑问那你应该查看使用Springo.s.context.event.GenericApplicationListenerAdapter分发ApplicationEvent事件的巧妙代码。看一下并学习一些Java反射的新技巧。】

         重启应用,然后进行一些常用的行为如登录、退出以及登录失败。你能看到,当这些行为执行时,适当的时间被触发并打印在控制台上。

         尽管我们声明了自己的ApplicationListener来接受所有的认证事件,但是在大多数场景下这并不实用,根据系统使用情况的,在一个小时内可能会有数千个时间触发。通过修改类implements关键词上的泛型标示,我们能够使得实现类至监听一种类型的事件。

内置的ApplicationListeners

         Spring Security提供了两个ApplicationListener的实现类,它们绑定了在Spring Security中使用的Apache Commons Logging日志。两个ApplicationListener实现类,一个是负责认证事件,一个负责授权时间。你可以像以下代码那样配置它们:

 

<bean id="authenticationListener" 
  class="org.springframework.security .authentication.event.LoggerListener"/>
<bean id="authorizationListener" 
  class="org.springframework.security .access.event.LoggerListener"/>

 这两个监听器将会输出Commons Logging日志以对应的类命名。一个示例记录AbstractAuthenticationFailureEvent大致如下:

 

WARN - Authentication event 
AuthenticationFailureBadCredentialsEvent: adb; details: org.
springframework.security.web.authentication.WebAuthenticationDetails@2
55f8: RemoteIpAddress: 127.0.0.1; SessionId: B20510F25464B109CE3AE94D9
FBF981E; exception: Bad credentials

 如果你要实现类似的ApplicationListener来记录有用的事件,这些类可以作为模板。

大量的应用事件

         Spring Security提供了很多的事件,其试图在用户认证请求的所有点上给出有用的信息。你的应用可以监听可用的各种事件,这个范围可以很广泛(所有认证失败)也可以很窄小(一个用户通过提供完整的凭证认证成功)。完整的事件列表在附录:参考资料中。一些其它的关于异常处理和事件监听的注意事项如下:

l  授权事件和框架抛出异常的匹配关系可以通过DefaultAuthenticationEventPublisherexceptionMappings属性配置;

l  记住,正如我们在本章前面看到的,跟踪HttpSession的生命周期是通过web.xml配置的变化,而不直接是Spring

         你可以看到Spring Security的异常和事件处理很强大,允许在你的安全系统中进行很多场景的跟踪和对活动的响应。

构建一个自定义实现的SpEL表达式处理器

         我们将会阐述一个扩展基本SpEL表达式处理器的简单例子,提供一个表达式如果当前日期的分钟数为偶数将会允许访问。尽管这是一个很牵强的例子,但是它描述了实现自定义SpEL表达式方法的所有步骤。

         让我们创建一个类com.packtpub.springsecurity.security.CustomWebSecurityExpressionRoot以建立自定义扩展的WebSecurityExpressionRoot

 

public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {
  public CustomWebSecurityExpressionRoot (Authentication a, FilterInvocation fi) {
    super(a, fi);
  }
  public boolean isEvenMinute() {
    return (Calendar.getInstance().get(Calendar.MINUTE) % 2) == 0;
  }
}

          接下里,我们需要一个实现WebSecurityExpressionHandler的类。我们扩展了DefaultWebSecurityExpressionHandler并重写一个方法在com.packtpub.springsecurity.security.CustomWebSecurityExpressionHandler类中建立自己的CustomWebSecurityExpressionRoot

 

public class CustomWebSecurityExpressionHandler 
  extends DefaultWebSecurityExpressionHandler {
  public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
    StandardEvaluationContext ctx = (StandardEvaluationContext) 
      super.createEvaluationContext(authentication, fi);
    SecurityExpressionRoot root = new CustomWebSecurityExpressionRoot(authentication, fi);
    ctx.setRootObject(root);
      return ctx;
  }
}

 最后,当建立Voter时需要重新配置bean引用,如下:

 

<bean class="com.packtpub.springsecurity.security.CustomWebSecurityExpressionHandler"
 id="customExpressionHandler"/>
<bean class="org.springframework.security.web.access.expression.WebExpressionVoter"
 id="expressionVoter">
  <property name="expressionHandler" ref="customExpressionHandler"/>
</bean>

 现在,我们可以使用这个表达式来根据时间的分钟数是偶数还是奇数进行限制访问。

 

<security:intercept-url pattern="/*" access="evenMinute"/>

 很显然,这是一个简单的例子,但是阐述了实现自定义SpEL属性的基本步骤,你可以使用这种方式来控制对应用特定部分的访问。

【配置自定义SpEL Voter的技术可能在使用security命名空间的时候也会用到,只需使用access-decision-manager-ref属性定义一个自定义的AccessDecisionManager,就像我们在第二章见过的那样。】

小结

         在本章中,我们介绍了Spring Security标准配置的功能并实现了一些高级的自定义功能。我们涉及到以下的内容:

l  实现自定义的servlet过滤器来处理基于IP和角色的过滤以及基于HTTP头的SSO请求;

l  添加一个自定义的AuthenticationProvider及支持类,从而实现HTTP请求头的SSO

l  了解session固化防护和session并发处理的配置及好处,包括一些间接的功能以允许用户进行session报告;

l  配置自定义的访问控制拒绝处理并了解何时及为何AccessDeniedException会被抛出,还有怎样适当地响应它;

l  替换Spring Security的自动化配置为手动声明所有需要的参与类,这借助于标准的Sping bean XML配置技术;

l  了解一些基于Spring bean配置的高级功能,包括session管理和事件发布;

l  实现自定义和内置的ApplicationListener来响应Spring Security框架发布的特定事件;

l  实现标准SpEL表达式处理器的自定义扩展以允许个性化的URL访问表达式。

多有趣的一章!我们已经很习惯Spring Security,并进行了一些高级的扩展和自定义。

在第七章中,我们将会进行高级配置的旅程,通过使用访问控制列表使得实现复杂认证变得可能。

  • 大小: 63.6 KB
4
0
分享到:
评论
7 楼 xiaobinbin123 2016-03-30  
很是感激作者 这本书可以说让我们更加了解了SpringSecurity
6 楼 jinnianshilongnian 2012-03-23  
here
5 楼 wengbo316 2011-12-27  
真的太感谢了,赶紧把剩下的发上来让大家品味吧。。。楼主要是出书,我肯定买!
4 楼 lengyun3566 2011-12-20  
keer2345 写道
我只能够说,这一系列文章真是太让人激动了,一直在感叹,这就是我想要的一本好书,谢谢作者了

多谢夸奖,本书的后续部分已经翻译完,会陆续上传,请继续关注,谢谢
3 楼 keer2345 2011-12-20  
我只能够说,这一系列文章真是太让人激动了,一直在感叹,这就是我想要的一本好书,谢谢作者了
2 楼 LF_eng 2011-11-30  
终于更新了....
csdn有英文版的:http://download.csdn.net/detail/changeordie/3753581
1 楼 gkm422 2011-11-24  
能提供以下整书英文版下载吗?
或者给我发个也可以的,谢谢了
邮箱:gkm422@qq.com

相关推荐

    Spring security认证授权

    Spring security认证授权例子,自动创建数据库,在SysUser类增加字段,即可动态增加数据库对应表sys_user字段(前提是要删除原表,启动应用时才会重建表)

    spring security 3 登录 退出 认证 最少配置

    应用中涉及到安全认证,目前项目有独立的统一认证网关,所以登录时只需要将安全认证网关的认证后信息塞到spring security中,由security3来管理用户的权限设置。目前项目由spring security2升级到spring security3。...

    spring security3 中文版本

    spring security3 中文版本

    springboot+ spring security实现登录认证

    springboot+ spring security实现登录认证

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    1.本项目为SpringCloud Gateway的微服务框架,整合了SpringSecurity,微服务间使用Redis来获取登陆的用户信息。 2.由于Gat

    springSecurity3中文文档

    第一章:一个不安全应用的剖析...第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:spring Security扩展

    Spring Security 3.pdf

    Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf

    spring security spring security

    spring security spring security 中文文档

    springSecurity3例子

    简单的 springSecurity3例子代码

    Spring Security 资料合集

    Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf

    spring security 技术开发企业级认证与授权

    spring security 开发企业级认证与授权spring security 开发企业级认证与授权spring security 开发企业级认证与授权spring security 开发企业级认证与授权

    SpringSecurity项目

    springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个...最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。

    Spring Security Oauth2.0认证授权专题

    Spring boot+Spring Security Oauth2.0,Sprint cloud+Spring Security Oauth2集成。四种认证方式。附带有代码,和案例,案例,还有视频链接。我保证看完就回,如果视频链接失效,评论回复我,我单独再给你一份。

    Spring Security技术栈开发企业级认证与授权.zip

    集成 spring securit, spring security oauth 和 spring social,实现 用户名密码登录,手机验证码登录,社交账号登录,基于jwt的sso,集群session管理等功能。

    spring security3动态权限

    struts2 + spring3 + hibernate3 + spring security3 + mysql + tomcat sys_users;sys_roles;sys_authorities;sys_resources;sys_users_roles;sys_roles_authorities;sys_authorities_resources; PS:此项目运行不...

    统一安全认证(基于Spring Security 3)

    Java语言开发的统一角色访问控制系统(Unified Role Access Control System),基于Spring Security 3实现的权限控制系统 程序框架版本说明:Spring MVC 3.0.6 + Spring Security 3.1.3 + Hibernate 3.6.10 运行...

    Spring Security3 Demo

    Spring Security3 Demo ,根据Spring Security 安全权限管理手册 整理出的例子。 通过eclipse部署。

    Spring Security3

    Spring Security3

    精彩:Spring Security 演讲PPT

    3、Spring Security 2.x Overview 4、Dive Into Spring Security Authentication Authorization 5、Development Experiences & Demo 6、Q & A 张明星 5年以上保险、电信大中型项目开发经验,对JavaEE有较深入理解...

    Spring Security+OAuth2 精讲,打造企业级认证与授权2022升级

    Spring Security+OAuth2 精讲,打造企业级认证与授权(2022升级版) 1、企业级认证授权专项解决方案 系统解锁后端开发者必备的"安全"技能 2、主流安全框架核心一网打尽,只学实用的

Global site tag (gtag.js) - Google Analytics