Как разрешить анонимный вход в org.apache.ftpserver? - PullRequest
4 голосов
/ 27 ноября 2009

Я написал такой небольшой код, чтобы запустить встроенный в мое приложение ftp-сервер. Он основан на apache ftpserver

Я обнаружил, что анонимный пользователь не может войти в систему. Клиент продолжает получать 530.

Должен ли я добавить файл конфигурации для ftp? Я не могу найти API для создания пользователя для добавления в 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();
}

Ответы [ 3 ]

7 голосов
/ 01 ноября 2013

Собственный UserManager не нужен. Попробуйте это:

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);
1 голос
/ 26 января 2011

Для обеспечения анонимного входа через Apache FtpServer необходимо включить анонимную аутентификацию, а затем добавить «анонимного» пользователя в UserManager.

Вот фрагмент, который устанавливает анонимную аутентификацию:

FtpServerFactory serverFactory = new FtpServerFactory();

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

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

startFtpServer(serverFactory);

Затем вы можете предоставить UserManager, который аутентифицирует и авторизует логины. Вот пользовательский UserManagerFactory и 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;
    }
}

Бит, который действительно имеет значение, это возвращение anonUser .

НТН

0 голосов
/ 27 ноября 2009

Попробуйте установить anon-enabled="true" в конфигурации вашего сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...