2009-11-27 3 views
4

J'ai écrit un petit code comme celui-ci pour démarrer un serveur FTP intégré dans mon application. Il est basé sur apache ftpserverComment autoriser une connexion anonyme dans org.apache.ftpserver?

J'ai trouvé que l'utilisateur anonyme ne pouvait pas se connecter. Le client conserve 530.

Ai-je ajouté un fichier de configuration pour ftp? Je ne trouve aucune API pour créer un utilisateur à ajouter à UserManger.

private void start_ftp() throws FtpException { 
    FtpServerFactory serverFactory = new FtpServerFactory(); 

    ListenerFactory factory = new ListenerFactory(); 

    // set the port of the listener 
    factory.setPort(DEF_FTP_PORT); 

    // replace the default listener 
    serverFactory.addListener("default", factory.createListener()); 

    Ftplet fl = new MyFtplet(); 

    Map<String, Ftplet> map_ftplest = new LinkedHashMap<String, Ftplet>(); 
    map_ftplest.put("default", fl); 

    serverFactory.setFtplets(map_ftplest); 

    UserManagerFactory u_factory = new PropertiesUserManagerFactory(); 
    UserManager u_manager = u_factory.createUserManager(); 
    //u_manager. 
    Boolean b = u_manager.doesExist("anonymous"); 

    serverFactory.setUserManager(u_manager); 

    // start the server 
    server = serverFactory.createServer(); 

    server.start(); 
} 

Répondre

1

Pour obtenir une connexion anonyme via Apache FtpServer, vous devez activer l'authentification anonyme, puis ajouter un utilisateur "anonyme" au UserManager.

Voici un extrait qui définit l'authentification anonyme:

FtpServerFactory serverFactory = new FtpServerFactory(); 

ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory(); 
connectionConfigFactory.setAnonymousLoginEnabled(false); 

serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig()); 
serverFactory.setUserManager(new TestUserManagerFactory().createUserManager()); 

startFtpServer(serverFactory); 

Vous pouvez ensuite fournir un UserManager qui authentifie et autorise les connexions. Voici une coutume UserManagerFactory et AbstractUserManager:

private class TestUserManagerFactory implements UserManagerFactory { 

    @Override 
    public UserManager createUserManager() { 
     return new TestUserManager("admin", new ClearTextPasswordEncryptor()); 
    } 
} 

private class TestUserManager extends AbstractUserManager { 
    private BaseUser testUser; 
    private BaseUser anonUser; 

    public TestUserManager(String adminName, PasswordEncryptor passwordEncryptor) { 
     super(adminName, passwordEncryptor); 

     testUser = new BaseUser(); 
     testUser.setAuthorities(Arrays.asList(new Authority[] {new ConcurrentLoginPermission(1, 1)})); 
     testUser.setEnabled(true); 
     testUser.setHomeDirectory(TEST_USER_FTP_ROOT); 
     testUser.setMaxIdleTime(10000); 
     testUser.setName(TEST_USERNAME); 
     testUser.setPassword(TEST_PASSWORD); 

     anonUser = new BaseUser(testUser); 
     anonUser.setName("anonymous"); 
    } 

    @Override 
    public User getUserByName(String username) throws FtpException { 
     if(TEST_USERNAME.equals(username)) { 
      return testUser; 
     } else if(anonUser.getName().equals(username)) { 
      return anonUser; 
     } 

     return null; 
    } 

    @Override 
    public String[] getAllUserNames() throws FtpException { 
     return new String[] {TEST_USERNAME, anonUser.getName()}; 
    } 

    @Override 
    public void delete(String username) throws FtpException { 
     //no opt 
    } 

    @Override 
    public void save(User user) throws FtpException { 
     //no opt 
     System.out.println("save"); 
    } 

    @Override 
    public boolean doesExist(String username) throws FtpException { 
     return (TEST_USERNAME.equals(username) || anonUser.getName().equals(username)) ? true : false; 
    } 

    @Override 
    public User authenticate(Authentication authentication) throws AuthenticationFailedException { 
     if(UsernamePasswordAuthentication.class.isAssignableFrom(authentication.getClass())) { 
      UsernamePasswordAuthentication upAuth = (UsernamePasswordAuthentication) authentication; 

      if(TEST_USERNAME.equals(upAuth.getUsername()) && TEST_PASSWORD.equals(upAuth.getPassword())) { 
       return testUser; 
      } 

      if(anonUser.getName().equals(upAuth.getUsername())) { 
       return anonUser; 
      } 
     } else if(AnonymousAuthentication.class.isAssignableFrom(authentication.getClass())) { 
      return anonUser; 
     } 

     return null; 
    } 
} 

Le bit qui compte vraiment est le retour de anonUser.

HTH

0

Essayez de définir anon-enabled="true" dans la configuration de votre serveur.

+0

Cela signifie que je dois ajouter un fichier de configuration que je ne pense pas être une bonne idée. – ablmf

+1

@The @abl donc votre demande comment faites-vous cela par programme sans avoir un fichier de configuration? – Earlz

4

Un UserManager n'est pas nécessaire. Essayez ceci:

FtpServerFactory serverFactory = new FtpServerFactory(); 
ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory(); 
connectionConfigFactory.setAnonymousLoginEnabled(true); 

serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig()); 

BaseUser user = new BaseUser(); 
user.setName("anonymous"); 
serverFactory.getUserManager().save(user); 

startFtpServer(serverFactory); 
Questions connexes