10

当用户尝试使用不正确的凭据登录或用户因某种原因被禁用时,我能够显示 SPRING_SECURITY_LAST_EXCEPTION.message(“错误凭据”)。

我想在用户被禁用的情况下显示一条自定义消息,而不是显示“错误凭据”而是说“您已被禁用......等等,等等......”。我怎么做?

我正在使用 UserDetailsS​​ervice 在 Spring Security 中提供用户名/密码。

4

2 回答 2

12

您需要将AbstractUserDetailsAuthenticationProvider的 hideUserNotFoundExceptions 属性设置为 false。(这意味着这个解决方案依赖于将来可能会改变的 Spring Security 代码)。

以下是步骤:

(1) 定义一个 DaoAuthenticationProvider bean(如果您已经有一个,则将其 hideUserNotFoundExceptions 属性设置为 false)。这是Java配置样式:

    @Bean
public AuthenticationProvider daoAuthenticationProvider() {
    DaoAuthenticationProvider impl = new DaoAuthenticationProvider();
    impl.setUserDetailsService(yourUserDetailsService());
    impl.setHideUserNotFoundExceptions(false) ;
    return impl ;
}

(2) 使用上述提供者配置身份验证管理器:

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="daoAuthenticationProvider"/>
<!-- other providers if any -->
</authentication-manager>

(3) 创建一个扩展UsernameNotFoundException的异常:

    public class DisabledException extends UsernameNotFoundException {

    public DisabledException(String msg) {
    super(msg);
    }

    /* other constructors */    
}

(4) 在您的 UserDetailsS​​ervice 中,使用您喜欢的任何消息键抛出上述异常:

    throw new DisabledException(messages.getMessage(
                        "AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled"));

这里的消息是SpringSecurityMessageSource.getAccessor()

于 2013-07-05T22:21:44.780 回答
0

在类路径中创建一个属性文件,例如 loginMessage.properties

在该属性文件中,指定

AbstractUserDetailsAuthenticationProvider.badCredentials=输入的用户名/密码不正确。

在 applicationContext.xml 中添加以下 bean,

<bean id="messageSource"   
    class="org.springframework.context.support.ResourceBundleMessageSource">  
    <property name="basenames">  
        <list>
            <value>loginMessage</value>
        </list>
    </property>
</bean>

在 userDao 中,如果结果为 null

throw new UsernameNotFoundException("");

之后,您会收到类似用户名/密码输入不正确的消息。而不是坏凭证

于 2014-01-23T12:18:36.203 回答