次のコードでは、管理者ユーザーと非管理者ユーザーを作成し、読み取り、書き込みの制限を設定し、スロットリングとアップロード レート制限を制限し、ダウンロード レート制限を課しています。
ユーザーのログインとログアウトのダウンロード開始イベントとダウンロード終了イベントをリッスンするリスナーが追加されました。
 import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import org.apache.ftpserver.FtpServer;
    import org.apache.ftpserver.FtpServerFactory;
    import org.apache.ftpserver.ftplet.Authority;
    import org.apache.ftpserver.ftplet.FileSystemFactory;
    import org.apache.ftpserver.ftplet.FtpException;
    import org.apache.ftpserver.ftplet.Ftplet;
    import org.apache.ftpserver.ftplet.UserManager;
    import org.apache.ftpserver.ftpletcontainer.impl.DefaultFtpletContainer;
    import org.apache.ftpserver.listener.ListenerFactory;
    import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
    import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor;
    import org.apache.ftpserver.usermanager.impl.BaseUser;
    import org.apache.ftpserver.usermanager.impl.ConcurrentLoginPermission;
    import org.apache.ftpserver.usermanager.impl.TransferRatePermission;
    import org.apache.ftpserver.usermanager.impl.WritePermission;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    public class SFTPServer {
        // ===========================================================
        // Constants
        // ===========================================================
        private final int FTP_PORT = 2221;
        private final String DEFAULT_LISTENER = "default";
        // private final Logger LOG = LoggerFactory.getLogger(SFTPServer.class);
        private static final List<Authority> ADMIN_AUTHORITIES;
        private static final int BYTES_PER_KB = 1024;
        private static final String DEFAULT_USER_DIR = "C:\\upload";
        public final static int MAX_CONCURRENT_LOGINS = 1;
        public final static int MAX_CONCURRENT_LOGINS_PER_IP = 1;
        // ===========================================================
        // Fields
        // ===========================================================
        private static FtpServer mFTPServer;
        private static UserManager mUserManager;
        private static FtpServerFactory mFTPServerFactory;
        private ListenerFactory mListenerFactor;
        // ===========================================================
        // Constructors
        // ===========================================================
        static {
            // Admin Authorities
            ADMIN_AUTHORITIES = new ArrayList<Authority>();
            ADMIN_AUTHORITIES.add(new WritePermission());
            ADMIN_AUTHORITIES.add(new ConcurrentLoginPermission(MAX_CONCURRENT_LOGINS, MAX_CONCURRENT_LOGINS_PER_IP));
            ADMIN_AUTHORITIES.add(new TransferRatePermission(Integer.MAX_VALUE, Integer.MAX_VALUE));
        }
        // ===========================================================
        // Getter & Setter
        // ===========================================================
        // ===========================================================
        // Methods for/from SuperClass/Interfaces
        // ===========================================================
        // ===========================================================
        // Methods
        // ===========================================================
        public void init() throws FtpException {
            mFTPServerFactory = new FtpServerFactory();
            mListenerFactor = new ListenerFactory();
            mListenerFactor.setPort(FTP_PORT);
            mFTPServerFactory.addListener(DEFAULT_LISTENER, mListenerFactor.createListener());
            mFTPServerFactory.getFtplets().put(FTPLetImpl.class.getName(), new FTPLetImpl());
            PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
            userManagerFactory.setFile(new File("ftpusers.properties"));
            userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());
            mUserManager = userManagerFactory.createUserManager();
            mFTPServerFactory.setUserManager(mUserManager);
            this.createAdminUser();
            SFTPServer.addUser("admin1", "admin1", 20, 20);
            mFTPServer = mFTPServerFactory.createServer();
            mFTPServer.start();
        }
        private UserManager createAdminUser() throws FtpException {
            UserManager userManager = mFTPServerFactory.getUserManager();
            String adminName = userManager.getAdminName();
            if (!userManager.doesExist(adminName)) {
                // LOG.info((new
                // StringBuilder()).append("Creating user : ").append(adminName).toString());
                BaseUser adminUser = new BaseUser();
                adminUser.setName(adminName);
                adminUser.setPassword(adminName);
                adminUser.setEnabled(true);
                adminUser.setAuthorities(ADMIN_AUTHORITIES);
                adminUser.setHomeDirectory(DEFAULT_USER_DIR);
                adminUser.setMaxIdleTime(0);
                userManager.save(adminUser);
            }
            return userManager;
        }
        public static void addUser(String username, String password, int uploadRateKB, int downloadRateKB) throws FtpException {
            BaseUser user = new BaseUser();
            user.setName(username);
            user.setPassword(password);
            user.setHomeDirectory(DEFAULT_USER_DIR);
            user.setEnabled(true);
            List<Authority> list = new ArrayList<Authority>();
            list.add(new TransferRatePermission(downloadRateKB * BYTES_PER_KB, uploadRateKB * BYTES_PER_KB)); // 20KB
            list.add(new ConcurrentLoginPermission(MAX_CONCURRENT_LOGINS, MAX_CONCURRENT_LOGINS_PER_IP));
            user.setAuthorities(list);
            mFTPServerFactory.getUserManager().save(user);
        }
        public static void restartFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.stop();
                try {
                    Thread.sleep(1000 * 3);
                } catch (InterruptedException e) {
                }
                mFTPServer.start();
            }
        }
        public static void stopFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.stop();
            }
        }
        public static void pauseFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.suspend();
            }
        }
        public static void resumeFTP() throws FtpException {
            if (mFTPServer != null) {
                mFTPServer.resume();
            }
        }
        public static void main(String... are) {
            try {
                new SFTPServer().init();
            } catch (FtpException e) {
                e.printStackTrace();
            }
        }
        // ===========================================================
        // Inner and Anonymous Classes
        // ===========================================================
    }
  FTPLET リスナー
import java.io.IOException;
import org.apache.ftpserver.ftplet.DefaultFtplet;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.FtpRequest;
import org.apache.ftpserver.ftplet.FtpSession;
import org.apache.ftpserver.ftplet.FtpletResult;
public class FTPLetImpl extends DefaultFtplet {
    @Override
    public FtpletResult onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Logged in");
        return super.onLogin(session, request);
    }
    @Override
    public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Disconnected");
        return super.onDisconnect(session);
    }
    @Override
    public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println(session.getUser().getName() + " Started Downloading File " + request.getArgument());
        return super.onDownloadStart(session, request);
    }
    @Override
    public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
        System.out.println("Finished Downloading " + request.getArgument());
        return super.onDownloadEnd(session, request);
    }
}
