Spring中的自定义身份validation
我有个问题。 在Struts中,我有一个处理用户身份validation的Action,即我获取了用户的凭据并使用DAO来validation用户凭据。 我想在Spring中保持相同的设置。 我正在使用Spring 3.0.3 RELEASE。
我的问题是,我已经阅读了Spring Security,并在那里指定了JDBC后端“Validation”提供程序。 我想知道,如果用户单击“登录”它将提交凭据提交给我的控制器以检查有效身份validation怎么办?
我想这样做的原因是我有一个处理用户身份validation和授权的服务。
提前致谢。
PS如何在Spring中使某些控制器安全?
PPS我是Spring的新手
您可以创建一个自定义身份validation提供程序来实现org.springframework.security.authentication.AuthenticationProvider
就像这样
package com.bzone.example; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; public class CustomAuthenticationProvider implements AuthenticationProvider{ @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { // TODO call custom service or do whatever you want return null; } @Override public boolean supports(Class extends Object> authentication) { // copied it from AbstractUserDetailsAuthenticationProvider return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); } }
还有一步是配置spring security以使用此自定义身份validation提供程序
通常,Spring Security使用您的代码作为策略(身份validation提供程序,用户详细信息服务等)在其自己的代码中处理身份validation。 但您可以在自己的代码中处理身份validation。
在您的操作代码中,当用户凭据正确时,您将:
- 创建包含用户名和授予角色的
Authentication
(您可以使用UsernamePasswordAuthenticationToken
作为方便的实现)。 - 把它放到安全上下文中:
SecurityContextHolder.getContext().setAuthentication(auth);
- 使用
AuthenticationEventPublisher.publishAuthenticationSuccess(...)
广播身份validation成功事件(您可以从上下文自动assembly它或显式创建DefaultAuthenticationEventPublisher
)。 - 使用
SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess(...)
将用户重定向到安全资源。
您还需要提供AuthenticationEntryPoint
:
...
但是,如果您在Spring中实际上是新手,那么最好避免这种大规模的自定义并使用常规的Spring Security架构。
您可以为Spring Security编写自己的validation机制。 它必须包含以下部分:
- validationfilter – 从请求中读取数据,然后使用凭证令牌(类validation的实例)调用validation提供程序
- Auth Provider – 接受此身份validation令牌(filter可以创建不同的tokents,并且每种令牌类型可以有不同的auth提供者),并尝试进行身份validation(根据您的情况调用您的服务)。 在auth之后,您可以(或可能不)调用用户详细信息服务或在那里填写所有用户数据
- 用户详细信息服务 – 从某个地方(从jdbc,其他服务等)加载用户详细信息