1

私は restlet で遊んでいて、パスワードとユーザー名が MysqlDatabase に保存されるログイン メカニズムを作成したいと考えています。

public class zeus extends Application {

    @Override
    public Restlet createInboundRoot() {
        // Δημιουργία του router.
        Router router = new Router(getContext());
        router.attach("/customers", CustomersResource.class);

        ChallengeAuthenticator guard = new ChallengeAuthenticator(getContext(), ChallengeScheme.HTTP_BASIC, "login required");

        UserVerifier verifier = new UserVerifier();
        verifier.verify(identifier, secret); // where do i get the identifier ?
        guard.setVerifier(verifier);

        guard.setNext(router);
        return guard;
    }
}

そして、私のユーザー検証クラス

public class UserVerifier extends SecretVerifier {

    @Override
    public boolean verify(String identifier, char[] secret) {
    System.out.println(identifier);
    System.out.println(secret);
    //TODO compare with the Database
    return true;
    }


}

識別子を取得する方法が見つかりません。

4

1 に答える 1

5

私があなたの質問を正しく理解していれば、あなたの問題は、Restlet ベリファイアからデータベースを操作する方法と、Restlet アプリケーション内で make を連携させる方法です。

最善の方法は、データベースの対話ロジックを実装する DAO を定義することです。そんな感じ:

public class SecurityDao {
    private DataSource dataSource;

    public SecurityDao() {
        // Intialize your datasource using DBCP or C3P0
        dataSource = new com.mchange.v2.c3p0.ComboPooledDataSource();
        dataSource.setDriverClass(MyDriverClass.class);
        dataSource.setJdbcUrl("jdbc:mysql://locahost/mydb");
        dataSource.setUser("username");
        dataSource.setPassword("pwd");

        // Don't forget to clean the pool when Restlet application stop
        // with ComboPooledDataSource#close method
    }

    public boolean hasUserPassword(String user, String password) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // Some SQL request like that
            ps = conn.prepareStatement("select * from <MYTABLE> where USER = ? and PASSWORD = ?");
            ps.setString(1, user);
            ps.setString(2, password);
            rs = ps.executeQuery();
            return rs.next();
        } catch(Exception ex) {
            (...)
        } finally {
            // close rs
            // close ps
            // close conn
        }
    }
}

これで DAO が実装されました。これを Restlet アプリケーション クラスからインスタンス化し、ベリファイア内に設定します。

public class zeus extends Application {
    private SecurityDao securityDao;

    public zeus() {
        securityDao = new SecurityDao();
    }

    @Override
    public Restlet createInboundRoot() {
        (...)

        UserVerifier verifier = new UserVerifier();
        verifier.setSecurityDao(securityDao);

        (...)
        return guard;
    }
}

以下で説明するように、ベリファイアを少し調整する必要があります。

public class UserVerifier extends SecretVerifier {
    private SecurityDao securityDao;
    public void setSecurityDao(SecurityDao securityDao) {
        this.securityDao = securityDao;
    }

    public boolean verify(String identifier, char[] secret) {
        System.out.println(identifier);
        System.out.println(secret);
        return securityDao.hasUserPassword(identifier, new String(secret));
        return true;
    }
}

実際、Restlet アプリケーションの createInboundRoot メソッドがルーティングを初期化します。これは、アプリケーションの起動時、つまり最初のリクエストが完了したときに 1 回行われます。その後、HTTP リクエストが受信されると、Restlet はこのリクエストに含まれるセキュリティ ヒントを使用して検証ツールを自動的に呼び出します。ベリファイアの verify メソッドを明示的に呼び出す必要はありません。Restlet フレームワークがそれを行います...

お役に立てば幸いです、ティエリー

于 2013-01-21T09:31:15.097 に答える