【问题标题】:Why is this BeanPostProcessor needed in addition to a UserDetailsService in this Spring 3.0 authentication example?在这个 Spring 3.0 身份验证示例中,除了 UserDetailsS​​ervice 之外,为什么还需要这个 BeanPostProcessor?
【发布时间】:2011-03-27 00:58:13
【问题描述】:

我正在尝试了解包含以下 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;
    }

}

【问题讨论】:

    标签: authentication spring-security


    【解决方案1】:

    这个postProcessBeforeInitialization() 方法是从BeanPostProcessor 接口实现的,它会在你的getter 和setter 方法执行完毕后自动执行 一旦postProcessBeforeInitialization()方法执行完毕,对象就会被初始化,然后postProcessAfterInitialization()就会执行。

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

    【讨论】:

      【解决方案2】:

      是的,UserDetailsService 就足够了。

      BeanPostProcessor 更改登录请求中的用户名和密码参数的名称(即登录表单中的字段名称) - 这些属性不能通过命名空间配置进行配置,并且使用 BeanPostProcessorss 来自定义此类properties 是一种丑陋但相当普遍的做法。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 2015-10-12
      • 2015-10-16
      • 2010-09-07
      • 2021-04-02
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      相关资源
      最近更新 更多