【问题标题】:How to hold multiple usernames and passwords in properties file如何在属性文件中保存多个用户名和密码
【发布时间】:2012-10-16 12:37:41
【问题描述】:

我有一个属性文件,其中包含我在 java 程序中使用的用户名和密码,但是我无法像在数据库中那样存储多个用户名和密码,只需选择用户名和密码与多行匹配的位置在数据库中。我想我需要在保存用户名和相应密码的文件中存储一个二维数组,但我无法弄清楚如何去做,谷歌也没有给我一种在文件中保存二维数组的方法然而。这是文件中我的用户名和密码的键/值对

    `password=k
     username=k`

这是读取它们并与用户插入的内容进行比较的代码

   `String usr = userfield.getText();
    String pwd = new String(pwdfield.getPassword());
    Properties config = new Properties();
    InputStream is;

    try {

        is = new FileInputStream("config.properties");
        config.load(is);

        if (usr.toString().equals(config.getProperty("user").toString()) && pwd.toString().equals(config.getProperty("pass").toString())) {
            new DocMenu();
            lgFrame.dispose();

        } else {
            JOptionPane.showMessageDialog(lgFrame, "Wrong credentials try again", "Oops", JOptionPane.ERROR_MESSAGE);

        }

        is.close();

    } catch (Exception ex) {
        System.out.println(ex);
        ex.printStackTrace();
    }`

有人能告诉我如何更改属性文件和代码,以便我能够在文件中拥有多个用户名和密码,只要他们的用户名和密码存在,就可以授予任何用户访问权限。

【问题讨论】:

  • 为什么不存储在HashSet中呢?并对其进行序列化/反序列化?
  • 感谢@Prototype Stark。能否举个例子或说明如何使用HashSet
  • 您可以拥有像这样的凭证属性:usernameA=p@ssW0rdAusernameB=l0km30t,当用户输入他们的用户名时,它会查找该属性并返回与他们输入的密码进行比较的密码. 注意: 这是一种不好的凭据,因为当您将密码放入属性文件时,您应该对密码进行一些加密,并且您的程序还应该加密用户密码条目,然后比较两者.
  • 我建议您检查您的设计:拥有多个(相同的)用户名没有多大意义 - 您需要管理每个用户的唯一 ID。但是,如果您无法区分具有相同用户名的用户这一事实不会打扰您,您可以将他们的密码存储在逗号分隔的列表中,该列表将由 Properties 转换为 ArrayList

标签: java properties


【解决方案1】:

如果您将属性名称存储为某个键与用户名的串联,密码存储为这样的值;

#Some bad passwords
username.bob=password
username.scott=tiger
username.admin=admin

..那么你可以这样检查;

String password = config.getProperty("username." + usr.toString());
if (password != null && password.equals(pwd.toString())) {
  new DocMenu();
  lgFrame.dispose();
} else {
  JOptionPane.showMessageDialog(lgFrame, "Wrong credentials try again", "Oops", JOptionPane.ERROR_MESSAGE);
}

【讨论】:

  • @ken 很棒 - 但正如前面所说,这是存储凭据的一种糟糕方式,我希望您没有使用它来保护任何重要的东西。
【解决方案2】:

在您发布的代码中,您的属性中有“用户名”,并且您正在尝试读取“用户”属性。 密码也是如此。

但这只会让您拥有一对用户/密码。您的属性文件中应该有一个更详细的结构。例如你可以有

user1=pwd1
user2=pwd2
...

然后检查类似:

if (password != null && password.equals(config.getProperty(usr)){
 // ok ...
}

【讨论】:

    【解决方案3】:

    如果你必须使用属性,我认为除了这样做之外别无选择

    username.1
    username.2
    username.3
    

    并不断迭代,直到找到找不到属性的索引(在本例中为username.4)。

    对于更复杂的配置,我会研究诸如Apache Commons Config 之类的框架,它可以处理lists of elements

    【讨论】:

      【解决方案4】:

      正如所承诺的,这里是 HashSet 序列化/反序列化代码:

      import java.util.*;
      import java.io.*;
      
      class UserPasswordMap{
         private HashMap<String,String> userMap;
         private String m_filename;
         public UserPasswordMap()
         {
             userMap = null;
             m_filename = null;
             userMap = new HashMap<String,String>();
         }
      
         public UserPasswordMap(String filename, String credo)
         {
             try{
                m_filename = filename;
                File f = new File(m_filename);
                userMap = new HashMap<String,String>();
                if(f.exists() && (!(f.canRead() && f.canWrite()))){ 
                    System.err.println("Oops, Insufficient permissions to read/write for filename: "+m_filename);
                }else{
                    f.createNewFile();
                }
             }catch(Exception e){
                 System.err.println(e.getMessage());
             }
      
             if(credo.equals("D")){
                 try{
                 ReadMap(filename);
                 }catch(Exception e){ System.err.println(e.getMessage());}
             }
         }
         public void ReadMap(String filename) throws IOException, ClassNotFoundException
         {
             FileInputStream fis = new FileInputStream(filename);
             ObjectInputStream ois = new ObjectInputStream(fis);
             userMap = (HashMap<String,String>)ois.readObject();
             fis.close();
         }
      
         public void WriteMap(String filename) throws IOException{
             FileOutputStream fos = new FileOutputStream(filename);
             ObjectOutputStream oos = new ObjectOutputStream(fos);
             oos.writeObject(userMap);
             oos.close();
         }
      
         public ArrayList<String> getUsers()
         {
             ArrayList<String> users = new ArrayList<String>();
             if(userMap == null){
                 return null;/*or return users*/
             }else{
                 for(String s:userMap.keySet()){
                     users.add(s);
                 }
             }
             return users;
         }
      
         public ArrayList<String> getPasswords()
         {
             ArrayList<String> passwords = new ArrayList<String>();
             if(userMap == null){
                 return null;/*or return users*/
             }else{
                 for(String s:userMap.values()){
                     passwords.add(s);
                 }
             }
             return passwords;
         }
      
         public String getPassword(String username)
         {
             return userMap.get(username);
         }
      
         public void addUser(String username, String password){
             userMap.put(username, password);
             try{
                 WriteMap(m_filename);
             }catch(Exception e){
                 System.err.println(e.getMessage());
             }
         }
      
         public void saveData(){
             if(m_filename == null){
                 System.err.println("File-Name is not supplied");
             }else{
                 try{
                    WriteMap(m_filename);
                 }catch(Exception e){
                     System.err.println(e.getMessage());
                 }
             }
         }
      }
      

      以及测试代码:

      public class Main{
          private UserPasswordMap map;
          public static void main(String[] args){
             Main obj = new Main();
             obj.init();
             Scanner scan = new Scanner(System.in);
             System.out.println("0. Init With Serialisation(CAN THROW ERROR)");
             while(true){
                System.out.println("1. Add New User");
                System.out.println("2. Query Permissions");
                System.out.println("3. Exit");
                int data = scan.nextInt();
                switch(data){
                case 0: obj.initWithSerialisation();
                break;
                case 1: obj.addNewUser();
                break;
                case 2: obj.queryPerms();
                break;
                case 3: System.exit(0);
                }
             }
          }
      
          public void init()
          {
               map = new UserPasswordMap("try1.ser","");
          }
      
          public void initWithSerialisation()
          {
              map = new UserPasswordMap("try1.ser","D");
          }
          private Scanner scan;
          public void addNewUser()
          {
              System.out.print("Enter User:");
              scan = new Scanner(System.in);
              String username = scan.nextLine();
              System.out.print("Enter Pass:");
              String password = scan.nextLine();
              map.addUser(username, password);
          }
      
          public void queryPerms()
          {
              System.out.print("Enter User:");
              if(scan == null){ scan = new Scanner(System.in);}
              String username = scan.nextLine();
              System.out.print("Enter Pass:");
              String pass = scan.nextLine();
      
              if(map.getUsers().contains(username) && map.getPassword(username).equals(pass)){
                  System.out.println("authenticated!");
              }else{
                  System.out.println("Oops Wrong credentials!");
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-07
        • 2021-12-07
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多