2013-12-16 2 views
3

Я пытаюсь создать экран входа для своего приложения, который отключает кнопку входа в систему в течение 5 минут после 3 неудачных попыток входа в систему.Временно отключить логин после неудачных попыток

Однако в моем приложении кнопку можно легко включить, закрыв приложение и снова запустив его.

Как исправить это?

Код:

public class LogIn extends Activity { 

    EditText username = null; 
    EditText password = null; 

    Button loginbutton = null; 

    int counter = 2; 

    String user = "admin"; 
    String pw = "password"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_log_in); 
     username = (EditText) findViewById(R.id.username); 
     password = (EditText) findViewById(R.id.password); 

     loginbutton = (Button) findViewById(R.id.loginbutton); 
     loginbutton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) 
      { String name = username.getText().toString(); 
       String pass = password.getText().toString(); 

       if (name.equals(user) && pass.equals(pw)) 
       // Successful Login 
       { Intent intent = new Intent(LogIn.this, MainApp.class); 
        startActivity(intent); 
       } 

       else if (name.equals("") || pass.equals("")) 
       // Missing username or password 
       { Toast alert = Toast.makeText(LogIn.this, "Please enter a username or password", Toast.LENGTH_SHORT); 
        alert.show(); 
       } 

       else if (counter == 0) 
       // Disable button after 3 failed attempts 
       { loginbutton.setEnabled(false); 

        Toast alert = Toast.makeText(LogIn.this, "Login Disabled for 5 mins", Toast.LENGTH_SHORT); 
        alert.show(); 

        final Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() 
        { @Override 
         public void run() 
         { loginbutton.setEnabled(true); 
          counter = 2; 
         } 
        }, 300000); 
       } 

       else 
       // Wrong password 
       { Toast alert = Toast.makeText(LogIn.this, "Wrong Credentials", Toast.LENGTH_SHORT); 
        alert.show(); 
        counter--; 
       }; 
      } 
     }); 
    }; 
} 
+1

Не должны ли все это быть реализованы на стороне сервера? – Bathsheba

+0

код выглядит хорошо. какая часть его не работает? – Kshitij

+1

Самая неприятная вещь о паролях - это блокировка ввода в течение нескольких минут. (Второй - это набор правил типа «ваш пароль должен содержать символы, по крайней мере, из двух алфавитов».) Несколько секунд было бы достаточно, чтобы сделать грубую силу нецелесообразной. – 18446744073709551615

ответ

1

В этом случае вы можете сохранить CURRENTTIME в предпочтении и проверить его, прежде чем пытаться войти снова

Это как предпочтение работает

// Initiate the preference with Preference Filename and Access Mode for other Apps 

SharedPreferences pref = getSharedPreferences("LoginTrack", Context.MODE_PRIVATE); // "LoginTrack" is the preference Name 

// read the preference 

long l = prefs.getLong("LastLoginDateTime", new Date().getTime()); 
String Attempts= pref.getString("MaxAttempts", ""); 


//To edit and save preferences again when you try login 

Date dt = new Date(); // Current Time to Track loginTime 
prefs.edit().putLong("LastLoginDateTime", dt.getTime()).commit(); 
prefs.edit().putString("MaxAttempts", "5").commit(); 

После получения данных конферансье их и подтвердите, как вы пожелаете

+0

Работает, но нет необходимости сохранять MaxAttempts, потому что он всегда будет того же значения. Благодаря! – user3106498

+0

Вы не хотите экономить сколько раз он пытался до сих пор в течение 5 минут? – Kirk

+0

В моем коде кнопка входа в систему отключена, когда число попыток достигает 3, поэтому всегда будет 3. Я предполагаю, что сохранение количества попыток зависит от контекста. – user3106498

1

Вы можете использовать Shared Preference хранить не попыток отказа. Если пользователь не может войти в приложение, вы не можете сохранить никаких попыток и время этой попытки в общей привилегии.

SharedPreferences pref = this.getSharedPreferences("Sample", Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = pref.edit(); 
editor.putString("ATTEMPTs", "5"); 
editor.putString("ATTEMPT_Time", System.currentTimeMillis()); 
editor.commit(); 

При запуске операции входа в систему проверьте отсутствие попыток совместного использования и включите или отключите кнопку входа соответственно.

SharedPreferences pref = this.getSharedPreferences("Sample", Context.MODE_PRIVATE); 
String no_attempt = pref.getString("ATTEMPTs", ""); 
String time= pref.getString("ATTEMPT_Time"," "); 

if(no_attempt>5 && Long.parseLong(time)>(System.currentTimeMillis()-300000)) 
{ 
    btn_login.setVisibilty(View.INVISIBLE); 
} 
else 
{ 
    //login 
} 
Смежные вопросы