当用户尝试使用不正确的凭据登录或用户因某种原因被禁用时,我能够显示 SPRING_SECURITY_LAST_EXCEPTION.message(“错误凭据”)。
我想在用户被禁用的情况下显示一条自定义消息,而不是显示“错误凭据”而是说“您已被禁用......等等,等等......”。我怎么做?
我正在使用 UserDetailsService 在 Spring Security 中提供用户名/密码。
当用户尝试使用不正确的凭据登录或用户因某种原因被禁用时,我能够显示 SPRING_SECURITY_LAST_EXCEPTION.message(“错误凭据”)。
我想在用户被禁用的情况下显示一条自定义消息,而不是显示“错误凭据”而是说“您已被禁用......等等,等等......”。我怎么做?
我正在使用 UserDetailsService 在 Spring Security 中提供用户名/密码。
您需要将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) 在您的 UserDetailsService 中,使用您喜欢的任何消息键抛出上述异常:
throw new DisabledException(messages.getMessage(
"AbstractUserDetailsAuthenticationProvider.disabled", "User is disabled"));
这里的消息是SpringSecurityMessageSource.getAccessor()
在类路径中创建一个属性文件,例如 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("");
之后,您会收到类似用户名/密码输入不正确的消息。而不是坏凭证