簡體   English   中英

客戶端/服務器用戶名/密碼認證

[英]Client/server username/password authentication

我正在使用客戶端/服務器身份驗證程序,但是遇到了問題。 客戶端可以很好地與服務器建立連接,但是一旦我輸入密碼和用戶名,它就不會返回有效的用戶名/密碼。 如果用戶使用正確的用戶名/密碼服務器登錄,則應返回“ Welcome,username”,如果無效,則返回“登錄失敗”。 我已經看過printwriter和bufferedreader文檔,以確保我使用正確的方法在服務器/客戶端之間正確傳遞文本。 我嘗試通過在服務器和客戶端上同時打印用戶名和密碼來進行調試,以確保它們都在監聽/寫入,因為它們確實會打印出正確的用戶名/密碼,因此它們似乎在監聽/寫入。 有人可以給我一些我要去哪里的見解嗎?

public class Connect {
    private String USERNAME = "java";
    private String PASSWORD = "java";
    private int PORT = 9090;
    private String HOSTNAME = "localhost";

    public String getUsername(){
        return this.USERNAME;
    }

    public String getPassword(){

        return this.PASSWORD;
    }

    public int getPort(){
        return this.PORT;
    }

    public String gethostName(){
        return this.HOSTNAME;
    }
}


import java.io.*;
import java.io.net.*;
public class Client {
    private final String FILENAME = null;
    Connect c = new Connect();
    Socket socket;
    BufferedReader read;
    PrintWriter output;

    public void startClient() throws UnknownHostException, IOException{
        //Create socket connection
        socket = new Socket(c.gethostName(), c.getPort());

        //create printwriter for sending login to server
        output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

        //prompt for user name
        String username = JOptionPane.showInputDialog(null, "Enter User Name:");

        //send user name to server
        output.println(username);

        //prompt for password
        String password = JOptionPane.showInputDialog(null, "Enter Password");

        //send password to server
        output.println(password);
        output.flush();

        //create Buffered reader for reading response from server
        read = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        //read response from server
        String response = read.readLine();
        System.out.println("This is the response: " + response);

        //display response
        JOptionPane.showMessageDialog(null, response);
    }

    public void fileInfo(){

    }

    public static void main(String args[]){
        Client client = new Client();
        try {
            client.startClient();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


import java.io.*;
import java.io.net.*;
public class Server {
    private int currentTot;
    ServerSocket serversocket;
    Socket client;
    int bytesRead;
    Connect c = new Connect();
    BufferedReader input;
    PrintWriter output;

    public void start() throws IOException{
        System.out.println("Connection Starting on port:" + c.getPort());
        //make connection to client on port specified
        serversocket = new ServerSocket(c.getPort());

        //accept connection from client
        client = serversocket.accept();

        System.out.println("Waiting for connection from client");

        try {
            logInfo();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void logInfo() throws Exception{
        //open buffered reader for reading data from client
        input = new BufferedReader(new InputStreamReader(client.getInputStream()));

        String username = input.readLine();
        System.out.println("SERVER SIDE" + username);
        String password = input.readLine();
        System.out.println("SERVER SIDE" + password);

        //open printwriter for writing data to client
        output = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));

        if(username.equals(c.getUsername()) &&password.equals(c.getPassword())){
            output.println("Welcome, " + username);
        }else{
            output.println("Login Failed");
        }

    }
    public static void main(String[] args){
        Server server = new Server();
        try {
            server.start();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }       
}

您還需要像在客戶端那樣刷新服務器的printWriter。

loginfo()方法的末尾,

if(username.equals(c.getUsername()) &&password.equals(c.getPassword())){
    output.println("Welcome, " + username);
}else{
    output.println("Login Failed");
}
output.flush();
output.close();

要針對代碼中的純文本字符串進行身份驗證,請使用條件檢查用戶名和密碼是否有效。

但是,如果您要假裝我們是真實世界,請根據LDAP或至少一個加密的屬性文件進行身份驗證...

Hashtable ldap = new Hashtable(11);
ldap.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldap.put(Context.PROVIDER_URL, "ldap://ldapserver:389/o=OU");
input = new BufferedReader(new InputStreamReader(client.getInputStream()));
String username = input.readLine();
String password = input.readLine();
ldap.put(Context.SECURITY_AUTHENTICATION, "tls");
ldap.put(Context.SECURITY_PRINCIPAL, "cn=" + username + ", ou=OU1, o=OU2");
ldap.put(Context.SECURITY_CREDENTIALS, password);

try {
    DirContext context = new InitialDirContext(ldap);
    context.addToEnvironment(Context.SECURITY_AUTHENTICATION, "none");
    context.close();
    } catch (Exception e) {
        e.toString();
    }
 }

甲骨文文檔提供...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM