代码之家  ›  专栏  ›  技术社区  ›  faceclean

如何允许匿名登录org.apache.ftpserver?

  •  4
  • faceclean  · 技术社区  · 16 年前

    我写了这样的代码来启动嵌入在我的应用程序中的FTP服务器。它是基于 apache ftpserver

    我发现匿名用户无法登录。客户一直得到530。

    我有没有为ftp添加配置文件?我找不到任何API来创建要添加到用户管理器的用户。

    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();
    }
    
    3 回复  |  直到 12 年前
        1
  •  1
  •   abargnesi    15 年前

    要通过ApacheFTPServer实现匿名登录,您必须启用匿名身份验证,然后将“匿名”用户添加到用户管理器。

    以下是设置匿名身份验证的代码段:

    FtpServerFactory serverFactory = new FtpServerFactory();
    
    ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory();
    connectionConfigFactory.setAnonymousLoginEnabled(false);
    
    serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig());
    serverFactory.setUserManager(new TestUserManagerFactory().createUserManager());
    
    startFtpServer(serverFactory);
    

    然后,您可以提供一个用户管理器来验证和授权登录。以下是自定义用户管理器目录和抽象用户管理器:

    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;
        }
    }
    

    真正重要的是 无人机 .

    高温高压

        2
  •  6
  •   louielouie    12 年前

    不需要自己的用户管理器。试试这个:

    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);
    
        3
  •  0
  •   miku    16 年前

    尝试设置 anon-enabled="true" 在服务器配置中。