Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为客户提供自定义密码规则设置机制?_Java_Security_User Interface_Authentication_Passwords - Fatal编程技术网

Java 如何为客户提供自定义密码规则设置机制?

Java 如何为客户提供自定义密码规则设置机制?,java,security,user-interface,authentication,passwords,Java,Security,User Interface,Authentication,Passwords,在我们的产品中,客户需要自定义密码规则设置器。这意味着他想为密码字段定义密码长度、包含大写、小写、特殊字符、数字等规则。我们如何为客户提供一个合适的界面来定义所有这些,而不使其变得复杂或难以理解?还有,是不是有点太多了,我们应该只提供一个自定义长度,并强制使用大写、小写和特殊字符 快速代码来说明我将如何进行: public class Test { StringBuilder passwordRules = new StringBuilder(); private void

在我们的产品中,客户需要自定义密码规则设置器。这意味着他想为密码字段定义密码长度、包含大写、小写、特殊字符、数字等规则。我们如何为客户提供一个合适的界面来定义所有这些,而不使其变得复杂或难以理解?还有,是不是有点太多了,我们应该只提供一个自定义长度,并强制使用大写、小写和特殊字符

快速代码来说明我将如何进行:

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,以显示已添加的规则),以允许客户以可视化方式添加这些规则。每次添加新规则时,调用相应的方法

当然,您还应该添加代码来删除规则,但我认为这段小代码给出了如何继续的想法

更新:为了更好地说明我的方法,我使用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();
    }
}
公共类测试扩展JFrame{
字符串密码规则;
JButton addLowerAndUpperCaseRuleButton;
JButton deleteSelectedButton;
JTextField addLowerAndUpperCaseRuleField;
JCheckBox addloweranduppercase规则框;
JList规则列表;
默认列表模型列表模型;
JTextField testPasswordField;
JButton测试密码按钮;
公开考试(){
此.setPreferredSize(新尺寸(900100));
addLowerAndUpperCaseRuleField=新的JTextField();
addLowerAndUpperCaseRuleField.setText(String.valueOf(1));
addLowerAndUpperCaseRuleField.setPreferredSize(新维度(30,25));
addLowerAndUpperCaseRuleBox=新的JCheckBox();
addLowerAndUpperCaseRuleButton=新JButton();
addLowerAndUpperCaseRuleButton.setText(“添加上下规则”);
addLowerAndUpperCaseRuleButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
addLowerAndUpperCaseRule(Integer.valueOf(addLowerAndUpperCaseRuleField.getText()),addLowerAndUpperCaseRuleBox.isSelected());
}
});
deleteSelectedButton=新建JButton();
deleteSelectedButton.setText(“删除选定项”);
deleteSelectedButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
移除(rulesList.getSelectedIndex());
}
});
rulesList=new JList();
规则列表设置尺寸(新尺寸(250,50));
listModel=新的DefaultListModel();
rulesList.setModel(列表模型);
testPasswordField=新的JTextField();
setPreferredSize(新维度(90,25));
testPasswordButton=新JButton(“检查”);
testPasswordButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
passwordRules=testPasswordField.getText();
布尔结果=检查密码(密码规则);
showMessageDialog(null,“密码检查返回”+结果);
}
});
此.add(addLowerAndUpperCaseRuleButton);
this.add(addLowerAndUpperCaseRuleField);
此.add(addLowerAndUpperCaseRuleBox);
添加(规则列表);
此.add(deleteSelectedButton);
添加(新的JLabel(“测试密码:”);
add(testPasswordField);
add(testPasswordButton);
this.setLayout(新的FlowLayout());
这个包();
此.setVisible(true);
此.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
private void addLowercaseUrle(整数长度,允许布尔数){
字符串规则;
如果(允许的编号){
rule=“[a-z0-9]{”+长度+“}”;
}否则{
rule=“[a-z]{“+length+”}”;
}
listModel.addElement(规则);
}
私有void addUpperCaseRule(整数长度,允许布尔数){
字符串规则;
如果(允许的编号){
rule=“[A-Z0-9]{”+长度+“}”;
}否则{
rule=“[A-Z]{“+length+”}”;
}
listModel.addElement(规则);
}
私有void addLowerAndUpperCaseRule(整数长度,允许布尔数){
字符串规则;
如果(允许的编号){
规则=“[aA-zZ0-9]{“+长度+”}”;
}否则{
rule=“[aA zZ]{”+长度+“}”;
}
listModel.addElement(规则);
}
私有布尔校验密码(字符串密码){
StringBuilder规则=新建StringBuilder();
对于(int i=0;i
您想了解布局的想法还是代码建议?我想了解如何为客户提供一个界面来提供所有这些信息的布局。我应该为大写、小写、特殊字符和长度计数指定标志吗?这样问似乎很粗鲁,我会用不同的颜色。显示所有条件,如果它们为绿色,则可以;如果为红色,则不可以。您可能希望查看最新的NIST指南(2017年):不建议对密码施加复杂性约束(仅强制执行长度和黑名单检查)。