答案 0 :(得分:19)
答案 1 :(得分:14)
有点晚了,但希望这可以帮助其他人找到这个链接。如果使用自定义UserDetailsService,则可以将User对象的credentialsNonExpired设置为false,例如,在该字段设置回true之前不允许访问任何安全内容。
基本上,当您有密码过期时,您将在用户模型中设置一个字段(可能是passwordExpired),当UserDetailsService拉取用户时,您的UserDetailsService将使用该值设置credentialsNonExpired。
然后,您需要做的就是在applicationContext-security.xml中添加一些配置来设置身份验证异常映射。这将允许您捕获使用过期凭据抛出的异常并强制用户重置密码页面。您还可以使用类似的方法捕获锁定和禁用的帐户。配置示例如下所示:
<强>的applicationContext-security.xml文件强>
<beans:bean id="exceptionTranslationFilter" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="org.springframework.security.authentication.BadCredentialsException">/login_error</beans:prop>
<beans:prop key="org.springframework.security.authentication.CredentialsExpiredException">/password_expired</beans:prop>
<beans:prop key="org.springframework.security.authentication.LockedException">/locked</beans:prop>
<beans:prop key="org.springframework.secuirty.authentication.DisabledException">/disabled</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<http use-expressions="true">
<!-- ADD BLACKLIST/WHITELIST URL MAPPING -->
<form-login login-page="/login" default-target-url="/" authentication-failure-handler-ref="exceptionTranslationFilter" />
</http>
然后确保您已设置控制器以使用适当的内容提供这些链接。
答案 2 :(得分:6)
是的,我用过滤器ForceChangePasswordFilter做了这个。因为如果用户手动键入url,他们可以绕过更改密码表单。使用过滤器,请求总是被截获。
答案 3 :(得分:3)
非常有用的答案形式jyore,这正是我所寻求的。如果您使用的是实现UserDetailsService
的自定义类,则可以在applicationContext.xml
中执行以下bean定义。有一件事是基于您的CML标头,您可能需要使用<bean ....
或<prop ...
而不是<beans:bean ...
或<beans:prop ...
import ......
@Service("userService")
public class UserDetailsServiceImpl implements UserDetailsService {
private static Logger logger = LoggerFactory
.getLogger(UserDetailsServiceImpl.class);
@Autowired
private UserDao userDao;
@Override
public UserDetails loadUserByUsername( String username )
throws UsernameNotFoundException, DataAccessException , CredentialsExpiredException ,BadCredentialsException ,
LockedException , DisabledException , UsernameNotFoundException
{
User user = userDao.getUserByUsername( username );
System.out.println("User Found");
if( user == null ){
// System.out.println("User Not Found");
logger.error( "User Not Found");
throw new UsernameNotFoundException( username + " is not found." );
}
if( user.isEnabled() == false ){
// System.out.println("User not enabled");
logger.error( "User not enabled");
throw new DisabledException( "User not enabled" );
}
if( user.isLocked() == true ){
//System.out.println("User is Locked");
logger.error( "User is Locked");
throw new LockedException( "User is Locked" );
}
if( user.isPasswordExpired() == true ){
// System.out.println("Password Expired");
logger.error( "Password Expired");
throw new CredentialsExpiredException( "Password Expired" );
}
return user;
}
}