Spring Security 授权通知类

接口类AuthenticationEventPublisher定义了Spring Security中用户授权成功或失败的通知机制.
方法:

//成功时调用
void publishAuthenticationSuccess(Authentication authentication);
//失败时调用
void publishAuthenticationFailure(AuthenticationException exception,
            Authentication authentication);

并且提供了一个默认的实现策略类DefaultAuthenticationEventPublisher,同时实现了接口类AuthenticationEventPublisher,ApplicationEventPublisherAware
DefaultAuthenticationEventPublisher在其内部维护一个异常类AuthenticationException和其对应的事件类AbstractAuthenticationFailureEvent的哈希表,方便将异常同授权事件对应起来.
(“成功的原因大都相似,失败的原因各种各样”)

//构造函数中初始化
addMapping(BadCredentialsException.class.getName(),AuthenticationFailureBadCredentialsEvent.class);
addMapping(UsernameNotFoundException.class.getName(),AuthenticationFailureBadCredentialsEvent.class);
addMapping(AccountExpiredException.class.getName(),AuthenticationFailureExpiredEvent.class);

授权成功时发布事件

applicationEventPublisher.publishEvent(new AuthenticationSuccessEvent(authentication));

失败时

Constructor<? extends AbstractAuthenticationEvent> constructor = exceptionMappings.get(exception.getClass().getName());
AbstractAuthenticationEvent event = null;
if (constructor != null) {
    try {
        event = constructor.newInstance(authentication, exception);
    } catch () {
    }
}
if (event != null) {
    if (applicationEventPublisher != null) {
        applicationEventPublisher.publishEvent(event);
    }
}

参照测试类DefaultAuthenticationEventPublisherTests可以理解其使用逻辑

publisher = new DefaultAuthenticationEventPublisher();
ApplicationEventPublisher appPublisher = mock(ApplicationEventPublisher.class);
publisher.setApplicationEventPublisher(appPublisher);
Authentication a = mock(Authentication.class);

Exception cause = new Exception();
Object extraInfo = new Object();
publisher.publishAuthenticationFailure(new BadCredentialsException(""), a);
publisher.publishAuthenticationFailure(new BadCredentialsException("", cause), a);
verify(appPublisher, times(2)).publishEvent(isA(AuthenticationFailureBadCredentialsEvent.class));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值