在WSO2 IS中设置密码历史记录策略

时间:2014-05-07 07:49:14

标签: wso2 wso2carbon wso2is

我要求在WSO2 - IS中设置密码历史记录限制,即如果我当前的密码是" Abc123",并且如果我想用" Abc123"再次,它不应该接受。

如果我将密码历史记录限制设置为" 3",则新密码应与为该特定帐户提供的最后3个密码不同。

请分享您对此的见解并帮助我完成任务。

2 个答案:

答案 0 :(得分:1)

如果您使用LDAP作为用户存储,那么您可以在其中应用密码策略。您可以在LDAP中分配密码历史记录计数。

如果你想在WSO2 IS本身做,那么你可能需要写一个custom password policy extension

答案 1 :(得分:1)

实际上,WSO2-IS不支持开箱即用的密码历史记录控制。这是当前实现中的限制,因为它始终使用用户存储的超级管理员凭据连接到用户存储。最好的选择是您可以编写自定义侦听器(扩展名)并将其与Identity Server一起插入。

添加新的侦听器实现

Listener是扩展用户核心功能的扩展。可以使用用户核心插入任意数量的侦听器,并逐个调用它们。通过使用监听器,我们不会覆盖用户存储实现,这很好,因为我们没有自定义现有的实现。 让我们看看它是如何工作的。

每次调用用户核心方法时,都会调用使用该方法注册的所有侦听器。可以在调用实际方法之前或之后注册监听器。让我们举个例子;在用户核心中,有一种名为“addUser()”的方法。在Identity Server中创建用户时,将调用“addUser()”方法。您可以在实际执行“addUser()”方法之前注册侦听器,还可以在实际执行“addUser()”方法后注册侦听器。 “addUser()”方法可以看作如下。

  

addUser(){
  preAddUser(); //你可以使用监听器实现这个   actualAddUser();
  postAddUser(); //你可以使用监听器实现这个   }

可以根据需要自定义“preAddUser()”“postAddUser()”方法。这意味着,您可以在添加用户之前或添加用户之后执行一些自定义操作。用户核心中的所有方法都已实现如上。这意味着您可以在...之前和之后自定义它们。

让我们采取以下简单的方案。

当用户通过LDAP进行身份验证时,需要将经过身份验证的时间添加为用户的属性。 因此,我们需要在成功进行用户身份验证后编写一些自定义代码。以下是此自定义侦听器实现。实际用户身份验证完成后,将调用“doPostAuthenticate()”方法。

  

package org.soasecurity.user.mgt.custom.extension;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.wso2.carbon.user.core.UserStoreException;
  import org.wso2.carbon.user.core.UserStoreManager;
  import org.wso2.carbon.user.core.common.AbstractUserOperationEventListener;
  / **
  *
  * /
  公共类MyUserMgtCustomExtension扩展AbstractUserOperationEventListener {
  private static Log log = LogFactory.getLog(MyUserMgtCustomExtension.class);
  @覆盖
  public int getExecutionOrderId(){
  返回9883;
  }
  @覆盖
  public boolean doPreAuthenticate(String userName,Object credential,   UserStoreManager userStoreManager)抛出UserStoreException {
  //只记录
  log.info("在使用用户存储进行身份验证之前调用doPreAuthenticate方法");
  返回true;
  }
  @覆盖
  public boolean doPostAuthenticate(String userName,boolean authenticated,UserStoreManager userStoreManager)抛出UserStoreException {
  //只记录
  log.info(" doPreAuthenticate方法在用user store&#34进行身份验证后调用;);
  //自定义逻辑
  //检查用户是否已通过身份验证
  if(authenticated){
  //将用户属性保留到用户存储中
  // "http://wso2.org/claims/lastlogontime"是声明uri,表示LDAP属性
  //有关索赔管理的详细信息,请点击http://soasecurity.org/2012/05/02/claim-management-with-wso2-identity-server/   userStoreManager.setUserClaimValue(userName," http://wso2.org/claims/lastlogontime",   Long.toString(System.currentTimeMillis()),null);
  }
  返回true;
  }   }

同样,您可以为用户核心的任何方法添加自定义扩展。

在此,我想注意以下事项。

  1. “getExecutionOrderId()”可以返回任何随机值。当身份服务器中有多个侦听器并且您需要考虑它们的执行顺序时,这很重要

  2. 所有方法都返回布尔值值。无论您是否要执行下一个侦听器,都会提到此值。

  3. 让我们看看配置自定义实现的步骤是什么。

    步骤1。监听器被注册为OSGI组件。因此,您需要在OSGI框架中注册此类。你可以通过这个完整的项目。

    第2步。将OSGI捆绑文件复制到 IS_HOME / repository / components / dropins 目录。

    第3步。重启服务器。