AcegiSecurity学习记录(二)

6 篇文章 0 订阅
6 篇文章 0 订阅

org.acegisecurity.providers.ProviderManager
    一个认证请求贯穿一系列AuthenticationProvider对象。可以通过ConcurrentSessionController来随意的限定一个用户可以拥有的会话数量。

    AuthenticationProvider序列将按顺序尝试直到其中一个AuthenticationProvider提供了一个非空的响应。一个非空的响应指出该AuthenticationProvider有能力对认证请求做出决定,并且其他的AuthenticationProvider将不再进行尝试。如果一个AuthenticationException从一个AuthenticationProvider抛出,那么该ProviderManager将持有该异常,直到其余的AuthenticationProvider被尝试。如果其余的AuthenticationProvider成功地认证了请求,那么先前的AuthenticationException将被忽略而成功的认证将被使用。如果其余的AuthenticationProvider没有一个能提供非空响应或者抛出一个新的AuthenticationException,那么先前捕获的最后一个AuthenticationException将被认可并使用。如果没有一个AuthenticationProvider返回非空响应,却还是需要由它来处理一个认证,则ProviderManager将抛出一个ProviderNotFoundException。

    如果一个AuthenticationProvider返回了一个正确的认证,那么ProviderManager将发布一个AuthenticationSuccessEvent。如果一个AuthenticationException被捕获,那么最终被抛出的AuthenticationException将用来发布一个适当的失败事件。默认的,ProviderManager为这些事件映射了公用的异常,这些可以通过提供一个新的java.util.Properties类型的exceptionMappings属性来进行调整。在这个Properties对象中,每个键描述了一个异常的权限定类名,而每个值描绘了一个继承自AbstractAuthenticationFailureEvent并提供其自己的构造函数的事件的类名。

    ProviderManager实现了AuthenticationManager接口。下面是对Authentication接口的说明:

org.acegisecurity.AuthenticationManager
    处理一个认证请求。定义了如下方法:
    Authentication authenticate(Authentication authentication)
    尝试认证传入的Authentication对象,如果成功,返回一个组装完整(包含权限信息)的Authentication对象。
   一个AuthenticationManager必须遵守以下关于异常的约定:
    如果AuthenticationManager可以检测账户状态且该账户为失效的,则必须抛出DisabledException;
    如果AuthenticationManager可以监测账户状态且该账户为锁定的,则必须抛出LockedException;
    AuthenticationManager必须总是测试信任状(口令),如果错误,必须抛出BadCredentialsException。
    如果一个账户是失效的或是被锁定的,则认证请求将被立即拒绝而信任状(口令)的监测处理将不会执行。

org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider
    基础的AuthenticationProvider允许子类覆盖并与UserDetails对象协作。这个类将响应UsernamePasswordAuthenticationToken认证请求。经过成功的认证,一个UsernamePasswordAuthenticationToken将被创建并返回给调用者。这个标记将包含由任意的字符串描述的用户名作为principal,或者是从认证仓库中返回的UserDetails作为Principal。返回String或UserDetails取决于使用的容器适配器。不推荐使用容器来控制principal的类型。默认返回的是UserDetails,如果希望返回字符串,则应调用setForcePrincipalAsString(true)。


    UserDetails可以被保存在UserCache中。这样确保了对后续的采用相同用户的请求的认证将不需要访问UserDetailsService。但是,如果用户提供了错误的密码,UserDetailsService将被访问。

    该抽象类定义了以下重要的方法:

    protected abstract void additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationToken authentication)throws AuthenticationException

    允许子类对从一个特定的认证请求中被返回的UserDetails进行任意的额外的检查。通常一个子类必须至少比较Authentication.getCredentials()方法的返回值与UserDetails.getPassword()方法的返回值。如果客户逻辑需要比较UserDetails或UsernamePasswordAuthenticationToken的额外的属性,则同样需要添加到这个方法中。

org.acegisecurity.userdetails.UserDetailsService

    为DaoAuthenticationProvider定义了提供数据访问服务实现的接口。
    这个接口只需要一个方法,即单一的新数据访问策略支持。

    UserDetails loadUserByUsername(String username)throws UsernameNotFoundException,org.springframework.dao.DataAccessException
    基于用户名取得用户信息。


org.acegisecurity.providers.dao.DaoAuthenticationProvider
    继承自AbstractUserDetailsAuthenticationProvider
    AuthenticationProvider实现了从UserDetailsService中取得用户详细信息的功能。

org.acegisecurity.ui.ExceptionTranslationFilter

处理从过滤器链中抛出的任何AccessDeniedException和AuthenticationException。
此过滤器是必须的。因为它提供了在Java异常与Http响应之间的桥梁。

如果AuthenticationException被发觉,则此过滤器将发动AuthenticationEntryPoint。它允许通用地处理源自AbstractSecurityInterceptor的任意子类的认证失败。
如果AccessDeniedException被发觉,无论用户是否是匿名用户此过滤器都将做出决断:如果是匿名用户,AuthenticationEntryPoint将被发动。如果不是匿名用户,
此过滤器将委派给AccessDeniedHandler。默认的,此过滤器使用AccessDeniedHandlerImpl。

要使用此过滤器,则必须定义如下属性:
authenticatioinEntryPooint:指出如果AuthenticationException被发觉将进行的认证处理。注意:这也许会将当前的协议从Http转换为Https的SSL登录。

此外,还有以下属性:
createSessionAllowed:
如果为真,则指出可以将目标URL和异常信息存储在HttpSession中(默认)。
在某些情形下,如果你因为用户代理知道失败的URL,例如BASI或Digest认证而不想去不必要地创建HttpSession,你也许想将这个属性设定为false。记住如果你将
此属性设定为false,你同样需要将HttpSessionIntergrationFilter.allowSessionCreation为false。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值