张玉&朱涛
EBS如何实现自定义密码规则?
原创 张玉&朱涛 爱记不记的记忆碎片
问 题
客户公司要求对EBS用户登录密码进行规范管理,提高密码复杂度,从而提高密码安全性。要求如下:
至少使用数字、大写英文字母、小写英文字母、特殊字符中的三种。当不满足情况时,报错提示。
答 案
我们在之前一期《EBS如何实现密码规则安全管理》介绍了R12标准功能对密码规则的设置。这一期我们来介绍一下如何实现自定义密码规则。
功能实现
场景回顾:
a) Upper case letters(e.g., A,B,C,......Z)
b) Lower case letters(e.g., a,b,c,......z)
c) Numbers(e.g., 0,1,2,......9)
d) Special characters(e.g., ?,!,%,$,#,etc.)
Step1. Developing your own custom class file XXCustPasswordRules.java
put the custom class file in the Middle tier code tree under any directory under CLASSPATH containing oracle/apps/fnd/security sub directory.
package oracle.apps.fnd.security;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import oracle.apps.fnd.common.VersionInfo;
// PasswordValidation
public class XXCustPasswordRules
implements PasswordValidation
{
public String getErrorStackApplicationName()
{
return "XXWA";
}
public String getErrorStackMessageName()
{
return m_errorStackMessageName;
}
public boolean validate(String username, String password)
{
/* Validates username = password */
// if(validateNoUsername(username, password))
// {
// m_errorStackMessageName = "XXCUST_USR_PWD_SAME";
// return false;
// }
//
// /* Check for repeated characters */
// if(!validateNoRepeats(password.toLowerCase()))
// {
// m_errorStackMessageName = "XXCUST_REPEAT_CHAR";
// return false;
// }
// /* Checks password contains XXCUST */
// if (validatePasswordNotContainsPattern(password,"XXCUST"))
// {
// m_errorStackMessageName = "XXCUST_INVALID_WORD";
// return false;
// }
/* Checks following rules
1) Contains A-Z
2) Contains a-z
3) Contains 0-9
4) Contains ?!%$#
5) Should satisfy above 3 rules */
if (!validatePassword(password))
{
m_errorStackMessageName = "XXCUST_PWD_RULE_CLASSES";
return false;
}
return true;
}
/* Checks for a pattern match */
private boolean hasPattern(String p_password,String p_pattern)
{
Pattern p = Pattern.compile(p_pattern);
Matcher m = p.matcher(p_password);
if (m.find())
return true;
else
return false;
}
/* Implements following rules
1) Contains A-Z
2) Contains a-z
3) Contains 0-9
4) Contains ?!%$#
*/
private boolean validatePassword(String password)
{
int count=0;
if (hasPattern(password,"[A-Z]"))
count++;
if (hasPattern(password,"[a-z]"))
count++;
if (hasPattern(password,"[0-9]"))
count++;
if (hasPattern(password,"[`~!@#$^&*()=|{}':;',\\\\[\\\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?%+_]"))
count++;
if (count<3)
return false;
else
return true;
}
/* Validates password does not contain pattern */
private boolean validatePasswordNotContainsPattern(String password,String pattern)
{
if (password.toLowerCase().contains(pattern.toLowerCase()))
return true;
else
return false;
}
/* Validate username = password */
private boolean validateNoUsername(String p_username, String p_password)
{
if (p_username.toLowerCase().equals(p_password.toLowerCase()))
return true;
else
return false;
}
boolean validateNoRepeats(String p_password)
{
for(int i = 1; i < p_password.length(); i++)
if(p_password.charAt(i) == p_password.charAt(i - 1))
return false;
return true;
}
private String m_errorStackMessageName;
}
Step2. Run the following command:
loadjava -user apps/ APPSPASSWORD -verbose -resolve -force XXCustPasswordRules.java
Step3. You can execute the following select after running the loadjava command to verify that load was successful and class is valid.
SELECT dbms_java.longname(object_name), statusFROM user_objects
WHERE object_type = 'JAVA CLASS'
AND dbms_java.longname(object_name) LIKE '%XXCustPasswordRules';
Step4.Update the profile Signon Password Custom with 'oracle.apps.fnd.security.XXCustPasswordRules' in Site level
Step5. If you want to customize the error message presented, implement following steps:
1) Go to 'Application Developer' > Application > Messages
a) Upper case letters(e.g., A,B,C,......Z)
b) Lower case letters(e.g., a,b,c,......z)
c) Numbers(e.g., 0,1,2,......9)
d) Special characters(e.g., ?,!,%,$,#,etc.)
3) submit request: Generate Messages
效果:
作者丨张玉&朱涛
审核丨陆 觉
编辑丨王 锐