简单的restlet登录

Ste*_*ras 1 java restful-authentication restlet restlet-2.0

我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的用户验证器类

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


}
Run Code Online (Sandbox Code Playgroud)

我找不到如何获取标识符.

Thi*_*ier 5

如果我正确理解您的问题,您的问题是如何从Restlet验证程序与数据库交互以及如何在Restlet应用程序中协同工作.

最好的方法是定义实现数据库交互逻辑的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们实现了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您现在需要调整您的验证程序,如下所述:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,Restlet应用程序的createInboundRoot方法初始化路由.当应用程序启动时,即第一个请求完成时,这将完成一次.然后,当收到HTTP请求时,Restlet会自动调用具有此请求中存在的安全提示的验证程序.你没有显式调用验证器的验证方法,Restlet框架会这样做......

希望它对你有帮助,蒂埃里