![](/img/trans.png)
[英]How to implement Grpc username/password authentication. Python client, Java server
[英]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.