如何为客户提供自定义密码规则设置机制?
How to provide customer a custom password rule setting mechanism?
在我们的产品中,客户想要自定义密码规则 setter。这意味着他想定义密码长度规则,包括密码字段的大写、小写、特殊字符、数字等。我们如何才能为客户提供一个合适的界面来定义所有这些,而又不会使其变得复杂或难以理解?另外,它是不是有点太多了,我们应该只提供自定义长度和强制大写、小写和特殊字符?
说明我将如何着手的快速代码:
public class Test {
StringBuilder passwordRules = new StringBuilder();
private void addLowerCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[a-z0-9]{").append(length).append("}");
}else{
passwordRules.append("[a-z]{").append(length).append("}");
}
}
private void addUpperCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[A-Z0-9]{").append(length).append("}");
}else{
passwordRules.append("[A-Z]{").append(length).append("}");
}
}
private void addLowerAndUpperCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[aA-zZ0-9]{").append(length).append("}");
}else{
passwordRules.append("[aA-zZ]{").append(length).append("}");
}
}
private boolean checkPassword(String password){
if (password.matches(passwordRules.toString())) return true;
return false;
}
public static void main(String[] args){
Test test = new Test();
test.addLowerAndUpperCaseRule(4, false);
test.addLowerAndUpperCaseRule(5, true);
String password = "tPrz05637";
String passwordTwo = "t8ea17r88";
System.out.println("First password returns " + test.checkPassword(password));
System.out.println("Second password returns " + test.checkPassword(passwordTwo));
}
}
您需要做的就是根据需要添加尽可能多的不同规则,然后构建一个布局(例如,一个带有按钮的 Jframe、textFields 和一个按顺序显示已添加规则的列表)以允许客户以视觉方式添加这些规则。每增加一条新规则,调用相应的方法
当然,您还应该添加代码来删除规则,但我认为这段小代码给出了如何进行操作的思路。
更新:我使用 Swing 开发了一个非常不愉快的布局来更好地说明我的方法。
public class Test extends JFrame{
String passwordRules;
JButton addLowerAndUpperCaseRuleButton;
JButton deleteSelectedButton;
JTextField addLowerAndUpperCaseRuleField;
JCheckBox addLowerAndUpperCaseRuleBox;
JList<String> rulesList;
DefaultListModel<String> listModel;
JTextField testPasswordField;
JButton testPasswordButton;
public Test(){
this.setPreferredSize(new Dimension(900, 100));
addLowerAndUpperCaseRuleField = new JTextField();
addLowerAndUpperCaseRuleField.setText(String.valueOf(1));
addLowerAndUpperCaseRuleField.setPreferredSize(new Dimension(30, 25));
addLowerAndUpperCaseRuleBox = new JCheckBox();
addLowerAndUpperCaseRuleButton = new JButton();
addLowerAndUpperCaseRuleButton.setText("Add lower and upper rule");
addLowerAndUpperCaseRuleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
addLowerAndUpperCaseRule(Integer.valueOf(addLowerAndUpperCaseRuleField.getText()), addLowerAndUpperCaseRuleBox.isSelected());
}
});
deleteSelectedButton = new JButton();
deleteSelectedButton.setText("Delete selected");
deleteSelectedButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
listModel.remove(rulesList.getSelectedIndex());
}
});
rulesList = new JList<>();
rulesList.setSize(new Dimension(250, 50));
listModel = new DefaultListModel<>();
rulesList.setModel(listModel);
testPasswordField = new JTextField();
testPasswordField.setPreferredSize(new Dimension(90, 25));
testPasswordButton = new JButton("Check");
testPasswordButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
passwordRules = testPasswordField.getText();
boolean result = checkPassword(passwordRules);
JOptionPane.showMessageDialog(null, "The password check returns " + result);
}
});
this.add(addLowerAndUpperCaseRuleButton);
this.add(addLowerAndUpperCaseRuleField);
this.add(addLowerAndUpperCaseRuleBox);
this.add(rulesList);
this.add(deleteSelectedButton);
this.add(new JLabel("Password to test: "));
this.add(testPasswordField);
this.add(testPasswordButton);
this.setLayout(new FlowLayout());
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
private void addLowerCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[a-z0-9]{" + length + "}";
}else{
rule = "[a-z]{" + length + "}";
}
listModel.addElement(rule);
}
private void addUpperCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[A-Z0-9]{" + length + "}";
}else{
rule = "[A-Z]{" + length + "}";
}
listModel.addElement(rule);
}
private void addLowerAndUpperCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[aA-zZ0-9]{" + length + "}";
}else{
rule = "[aA-zZ]{" + length + "}";
}
listModel.addElement(rule);
}
private boolean checkPassword(String password){
StringBuilder rules = new StringBuilder();
for(int i = 0; i < listModel.size(); i++){
rules.append(listModel.get(i));
}
if (password.matches(rules.toString())) return true;
return false;
}
public static void main(String[] args){
Test test = new Test();
}
}
在我们的产品中,客户想要自定义密码规则 setter。这意味着他想定义密码长度规则,包括密码字段的大写、小写、特殊字符、数字等。我们如何才能为客户提供一个合适的界面来定义所有这些,而又不会使其变得复杂或难以理解?另外,它是不是有点太多了,我们应该只提供自定义长度和强制大写、小写和特殊字符?
说明我将如何着手的快速代码:
public class Test {
StringBuilder passwordRules = new StringBuilder();
private void addLowerCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[a-z0-9]{").append(length).append("}");
}else{
passwordRules.append("[a-z]{").append(length).append("}");
}
}
private void addUpperCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[A-Z0-9]{").append(length).append("}");
}else{
passwordRules.append("[A-Z]{").append(length).append("}");
}
}
private void addLowerAndUpperCaseRule(int length, boolean numbersAllowed){
if(numbersAllowed){
passwordRules.append("[aA-zZ0-9]{").append(length).append("}");
}else{
passwordRules.append("[aA-zZ]{").append(length).append("}");
}
}
private boolean checkPassword(String password){
if (password.matches(passwordRules.toString())) return true;
return false;
}
public static void main(String[] args){
Test test = new Test();
test.addLowerAndUpperCaseRule(4, false);
test.addLowerAndUpperCaseRule(5, true);
String password = "tPrz05637";
String passwordTwo = "t8ea17r88";
System.out.println("First password returns " + test.checkPassword(password));
System.out.println("Second password returns " + test.checkPassword(passwordTwo));
}
}
您需要做的就是根据需要添加尽可能多的不同规则,然后构建一个布局(例如,一个带有按钮的 Jframe、textFields 和一个按顺序显示已添加规则的列表)以允许客户以视觉方式添加这些规则。每增加一条新规则,调用相应的方法
当然,您还应该添加代码来删除规则,但我认为这段小代码给出了如何进行操作的思路。
更新:我使用 Swing 开发了一个非常不愉快的布局来更好地说明我的方法。
public class Test extends JFrame{
String passwordRules;
JButton addLowerAndUpperCaseRuleButton;
JButton deleteSelectedButton;
JTextField addLowerAndUpperCaseRuleField;
JCheckBox addLowerAndUpperCaseRuleBox;
JList<String> rulesList;
DefaultListModel<String> listModel;
JTextField testPasswordField;
JButton testPasswordButton;
public Test(){
this.setPreferredSize(new Dimension(900, 100));
addLowerAndUpperCaseRuleField = new JTextField();
addLowerAndUpperCaseRuleField.setText(String.valueOf(1));
addLowerAndUpperCaseRuleField.setPreferredSize(new Dimension(30, 25));
addLowerAndUpperCaseRuleBox = new JCheckBox();
addLowerAndUpperCaseRuleButton = new JButton();
addLowerAndUpperCaseRuleButton.setText("Add lower and upper rule");
addLowerAndUpperCaseRuleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
addLowerAndUpperCaseRule(Integer.valueOf(addLowerAndUpperCaseRuleField.getText()), addLowerAndUpperCaseRuleBox.isSelected());
}
});
deleteSelectedButton = new JButton();
deleteSelectedButton.setText("Delete selected");
deleteSelectedButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
listModel.remove(rulesList.getSelectedIndex());
}
});
rulesList = new JList<>();
rulesList.setSize(new Dimension(250, 50));
listModel = new DefaultListModel<>();
rulesList.setModel(listModel);
testPasswordField = new JTextField();
testPasswordField.setPreferredSize(new Dimension(90, 25));
testPasswordButton = new JButton("Check");
testPasswordButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
passwordRules = testPasswordField.getText();
boolean result = checkPassword(passwordRules);
JOptionPane.showMessageDialog(null, "The password check returns " + result);
}
});
this.add(addLowerAndUpperCaseRuleButton);
this.add(addLowerAndUpperCaseRuleField);
this.add(addLowerAndUpperCaseRuleBox);
this.add(rulesList);
this.add(deleteSelectedButton);
this.add(new JLabel("Password to test: "));
this.add(testPasswordField);
this.add(testPasswordButton);
this.setLayout(new FlowLayout());
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
private void addLowerCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[a-z0-9]{" + length + "}";
}else{
rule = "[a-z]{" + length + "}";
}
listModel.addElement(rule);
}
private void addUpperCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[A-Z0-9]{" + length + "}";
}else{
rule = "[A-Z]{" + length + "}";
}
listModel.addElement(rule);
}
private void addLowerAndUpperCaseRule(int length, boolean numbersAllowed){
String rule;
if(numbersAllowed){
rule = "[aA-zZ0-9]{" + length + "}";
}else{
rule = "[aA-zZ]{" + length + "}";
}
listModel.addElement(rule);
}
private boolean checkPassword(String password){
StringBuilder rules = new StringBuilder();
for(int i = 0; i < listModel.size(); i++){
rules.append(listModel.get(i));
}
if (password.matches(rules.toString())) return true;
return false;
}
public static void main(String[] args){
Test test = new Test();
}
}