To log in anonymously through Apache FtpServer, you must enable anonymous authentication, and then add the "anonymous" user to the UserManager.
Here is a snippet that sets up anonymous authentication:
FtpServerFactory serverFactory = new FtpServerFactory(); ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory(); connectionConfigFactory.setAnonymousLoginEnabled(false); serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig()); serverFactory.setUserManager(new TestUserManagerFactory().createUserManager()); startFtpServer(serverFactory);
Then you can provide a UserManager that authenticates and authorizes logins. Here is the custom UserManagerFactory and 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 {
The bit that really matters is the return of anonUser .
NTN
source share