Authentication 为什么在这个Spring3.0身份验证示例中,除了UserDetailsService之外还需要这个BeanPostProcessor?

Authentication 为什么在这个Spring3.0身份验证示例中,除了UserDetailsService之外还需要这个BeanPostProcessor?,authentication,spring-security,Authentication,Spring Security,我试图理解一个Spring3.0应用程序,它包含以下BeanPostProcessor实现。这段代码的用途是什么?我认为UserDetails服务足以获取和设置用户帐户信息 @Service public class UserPassAuthFilterBeanPostProcessor implements BeanPostProcessor { /** * The username parameter. */ private String usernam

我试图理解一个Spring3.0应用程序,它包含以下BeanPostProcessor实现。这段代码的用途是什么?我认为UserDetails服务足以获取和设置用户帐户信息

@Service
public class UserPassAuthFilterBeanPostProcessor implements BeanPostProcessor
{

    /**
     * The username parameter.
     */
    private String usernameParameter;

    /**
     * The password parameter.
     */
    private String passwordParameter;

    @Override
    public final Object postProcessAfterInitialization(final Object bean, final String beanName)
    {
        return bean;
    }

    @Override
    public final Object postProcessBeforeInitialization(final Object bean, final String beanName)
    {
        if (bean instanceof UsernamePasswordAuthenticationFilter)
        {
            final UsernamePasswordAuthenticationFilter filter = (UsernamePasswordAuthenticationFilter) bean;
            filter.setUsernameParameter(getUsernameParameter());
            filter.setPasswordParameter(getPasswordParameter());
        }

        return bean;
    }

    /**
     * Sets the username parameter.
     * 
     * @param usernameParameter
     *         the username parameter
     */
    public final void setUsernameParameter(final String usernameParameter)
    {
        this.usernameParameter = usernameParameter;
    }

    /**
     * Gets the username parameter.
     * 
     * @return the username parameter
     */
    public final String getUsernameParameter()
    {
        return usernameParameter;
    }

    /**
     * Sets the password parameter.
     * 
     * @param passwordParameter
     *         the password parameter
     */
    public final void setPasswordParameter(final String passwordParameter)
    {
        this.passwordParameter = passwordParameter;
    }

    /**
     * Gets the password parameter.
     * 
     * @return the password parameter
     */
    public final String getPasswordParameter()
    {
        return passwordParameter;
    }

}

是的,
userdetails服务
就足够了


BeanPostProcessor
更改登录请求中用户名和密码参数的名称(即登录表单中字段的名称)-无法通过命名空间配置配置这些属性,使用
BeanPostProcessor
s自定义这些属性是一种丑陋但非常常见的做法。

是,
userdetails服务就足够了


BeanPostProcessor
更改登录请求中用户名和密码参数的名称(即登录表单中字段的名称)-无法通过命名空间配置配置这些属性,使用
BeanPostProcessor
s来定制这些属性是一种丑陋但非常常见的做法。

postProcessBeforeInitialization()
方法是从
BeanPostProcessor
接口实现的,该接口在getter和setter方法完成执行后自动执行 一旦
postProcessBeforeInitialization()
方法完成执行,对象将被初始化,然后
postProcessAfterInitialization()
将执行


这些方法类似于生命周期方法。

后处理BeforeInitialization()
方法通过
BeanPostProcessor
接口实现,该接口在getter和setter方法完成执行后自动执行 一旦
postProcessBeforeInitialization()
方法完成执行,对象将被初始化,然后
postProcessAfterInitialization()
将执行


这些方法类似于生命周期方法。

如果这是一个愚蠢的问题,很抱歉,但您如何知道参数名称正在更改?@pnut:从UsernamePasswordAuthenticationFilter()的文档中,其属性在此后处理器实例化后更改。如果这是一个愚蠢的问题,很抱歉,但您如何知道参数名称正在更改?@pnut:来自UsernamePasswordAuthenticationFilter()的文档,其属性在此后处理器实例化后更改。