Как предоставить клиенту механизм настройки пользовательского пароля? - PullRequest
0 голосов
/ 27 мая 2020

В нашем продукте заказчику требуется настраиваемое средство установки правил паролей. Это означает, что он хочет определить правила для длины пароля, включения верхнего и нижнего регистра, специальных символов, цифр и т. Д. c для поля пароля. Как мы можем предоставить клиенту подходящий интерфейс, чтобы все это определить, не усложняя и не усложняя понимание? Кроме того, это слишком много, и мы должны просто указать произвольную длину и обязать верхний регистр, нижний регистр и специальные символы?

1 Ответ

1 голос
/ 27 мая 2020

Быстрый код, чтобы проиллюстрировать, как бы я go об этом сказал:

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();
    }
}
...