时间:2010-07-26 14:07:11

标签: spring spring-security

4 个答案:

答案 0 :(得分:19)

答案 1 :(得分:14)

有点晚了,但希望这可以帮助其他人找到这个链接。如果使用自定义UserDetailsS​​ervice,则可以将User对象的credentialsNonExpired设置为false,例如,在该字段设置回true之前不允许访问任何安全内容。

基本上,当您有密码过期时,您将在用户模型中设置一个字段(可能是passwordExpired),当UserDetailsS​​ervice拉取用户时,您的UserDetailsS​​ervice将使用该值设置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;
  }
}