-2

私はユーザープロファイルクラスを持っていて、それをロードするための最良の方法は何かと思っていました。私は次のコードを持っていて、それがそれを行う適切な方法であるかどうか知りたいと思いました。

UserProfile userProfile = null;
char[] password = {'a','b','c'};

for(UserProfile profile : UserProfiles){
    if(compareUserNameAndPassword("userName", password)){
        userProfile = profile;
    }

}

そして私のプロフィールクラス:

package jlibfprint;

public class UserProfile extends Profile {

    /**
     * constructor
     */
    public UserProfile(String userName, int id, char[] password){
        this.name = userName;
        this.id = id;
        this.password = password;
    }


    /**
     * Users password
     */
    private char[] password;

    /**
     * Set User password
     * @param password
     */
    public void setPassword(char[] password){

        this.password = password;

    }

    /**
     * compare passwords
     */
    public boolean compareUserNameAndPassword(String userName,char[] password) {

        if(this.name.equals(userName) && this.password.equals(password)){

            return true;

        }
        return false;

    }
}
4

1 に答える 1

1

これはクラスローディングではなく単一のクラスのインスタンスであるオブジェクトをチェックします。そしてそれはあるべきですprofile.compareUserNameAndPassword(userName,password)

あなたがそれをしている現在の方法は、あなたUserProfileのすべてがメモリにあることを意味します。通常、それらはデータベースにあり、クエリでユーザー名とパスワードの比較を行い、一致する場合にのみ1つをフェッチします。

おそらく、ある時点でパスワードをハッシュする必要があるかどうかも検討する必要があります。

また、「車輪の再発明」を行わず、役立つフレームワークツールを借りることも検討する必要があります。Hibernateは、データベースからのJavaオブジェクトの取得を簡素化するように設計されたオブジェクト関係管理ツールです。Springは、優れた設計手法を促進し、承認と認証、およびMVCアプローチを管理するのに役立つフレームワークです。

 /*
  * Retrieves a UserProfile from the database based on a username and password
  * Needs Apache Commons Codec package otherwise you have to use MessageDigest 
  * which gives a binary SHA-1
  * @param username The username to fetch
  * @param password The unhashed password
  * @return The UserProfile or null if the user was not found in the DB
  */ 
 private static UserProfile retrieveUserProfile(String username, char[] password) 
    throws SQLException {
     password  = DigestUtils.sha1Hex(password);
     //Assuming a pre-setup JDBC Connection object - `con`
     final String updateString = "SELECT userName, password FROM userProfiles" 
       + "WHERE username = ? AND password = ? LIMIT 1";
     PreparedStatement retrieveUserProfile = con.prepareStatement(updateString)
     retrieveUserProfile.setString(1,"username");
     retrieveUserProfile.setString(2,"password");
     ResultSet rs = retrieveUserProfile.execute();
     if(rs.next()) {
         return new UserProfile(username,password);
     }
     else {
         //User Not found
         return null;
     }
 }
于 2012-12-19T20:50:52.553 に答える