暂时禁用登录功能,以防止登录尝试失败。

3
我正在尝试为我的应用程序创建登录界面,在3次失败的登录尝试后禁用登录按钮5分钟。
然而,在我的应用程序中,只需关闭应用程序并再次启动即可轻松启用该按钮。
我该如何解决这个问题?
代码:
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
代码看起来不错。哪一部分出了问题? - Kshitij
1
密码最让人烦恼的事情就是输入错误后需要等待几分钟才能再次尝试。其次还有一些规则,比如“你的密码必须包含至少两个字母表中的字符”。只需要几秒钟就足以使暴力破解变得不切实际。 - 18446744073709551615
2个回答

1
你可以使用共享首选项来存储失败尝试次数。如果用户无法登录应用程序,您可以在共享首选项中存储尝试次数和时间。
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
}

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();

获取数据后,进行比较并按您的要求进行验证。

可以运行,但是没有必要保存MaxAttempts,因为它的值总是相同的。谢谢! - user3106498
你不想在5分钟内保存他到目前为止尝试的次数吗? - Kirk
在我的代码中,当尝试次数达到3次时,登录按钮将被禁用,因此它将始终为3。我想保存尝试次数是否必要取决于上下文。 - user3106498

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接