除了这个Spring 3.0身份验证示例中的UserDetailsS​​ervice之外,为什么还需要这个BeanPostProcessor?

时间:2010-08-08 20:12:18

标签: authentication spring-security

我正在尝试理解包含以下BeanPostProcessor实现的Spring 3.0应用程序。这段代码需要什么?我认为UserDetailsS​​ervice足以获取和设置用户帐户信息。

@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;
    }

}

2 个答案:

答案 0 :(得分:2)

是的,UserDetailsService就足够了。

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

答案 1 :(得分:1)

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

这些就像生命周期方法。