> On 三月 18, 2022, 6:51 a.m., Madhan Neethiraj wrote: > > security-admin/src/main/java/org/apache/ranger/db/XXAuthSessionDao.java > > Lines 71 (patched) > > <https://reviews.apache.org/r/73898/diff/2/?file=2266922#file2266922line71> > > > > This will result in 2 queries for each login attempt: > > 1. to get the last successful login time > > 2. to get number of failed login since last successful login > > > > Consider following to use only one query where possible: > > > > public boolean shouldLockUserLogin(String loginId, int seconds, int > > maxFailedLoginsBeforeLock) { > > boolean ret = false; > > Date startTime = new Date(DateUtil.getUTCDate().getTime() > > - seconds * 1000); > > int numOfFailedLogins = getFailedLoginsCountForUserSince(loginId, > > startTime); > > > > if (numOfFailedLogins >= maxFailedLoginsBeforeLock) { > > Date lastSuccessLoginTime = > > getLastSuccessfulLoginTimeSince(loginId, startTime); > > > > if (lastSuccessLoginTime != null) { > > numOfFailedLogins = getFailedLoginsCountForUser(loginId, > > lastSuccessLoginTime); > > > > ret = numOfFailedLogins >= maxFailedLoginsBeforeLock; > > } > > } > > > > return ret; > > } > > Kirby Zhou wrote: > ``` > return getEntityManager() > .createQuery("SELECT count(1) FROM > XXAuthSession obj" + > " WHERE obj.loginId = > :loginId" + > " AND obj.createTime > (" + > " SELECT > max(obj2.createTime) FROM XXAuthSession obj2" + > " WHERE obj2.loginId = > :loginId )" + > " AND > obj2.authStatus = 1 )" + > " AND obj.authStatus != 1", > Long.class) > .setParameter("authWindowStartTime", > authWindowStartTime) > .setParameter("loginId", loginId) > .getSingleResult(); > > ``` > > How about ? > > Kirby Zhou wrote: > Sorry for paste error. > > ``` > .createQuery("SELECT count(1) FROM > XXAuthSession obj" + > " WHERE obj.loginId = > :loginId" + > " AND obj.createTime > > :authWindowStartTime" + > " AND obj.createTime > (" + > " SELECT > max(obj2.createTime) FROM XXAuthSession obj2" + > " WHERE obj2.loginId = > :loginId " + > " AND > obj2.authStatus = 1 )" + > " AND obj.authStatus != 1", > Long.class) > .setParameter("authWindowStartTime", > authWindowStartTime) > .setParameter("loginId", loginId) > .getSingleResult(); > ``` > > Madhan Neethiraj wrote: > Does this work when the inner query returns null i.e. when there are now > successful logins for the user?
Good Point! ``` .createQuery("SELECT count(1) FROM XXAuthSession obj" + " WHERE obj.loginId = :loginId" + " AND obj.createTime > :authWindowStartTime" + " AND obj.createTime > COALESCE(" + " (SELECT max(obj2.createTime) FROM XXAuthSession obj2" + " WHERE obj2.loginId = :loginId " + " AND obj2.authStatus = 1)," + " 1)" + " AND obj.authStatus != 1", Long.class) ``` - Kirby ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/73898/#review224174 ----------------------------------------------------------- On 三月 18, 2022, 5:59 a.m., Kirby Zhou wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/73898/ > ----------------------------------------------------------- > > (Updated 三月 18, 2022, 5:59 a.m.) > > > Review request for ranger, Bhavik Bavishi, Abhay Kulkarni, Madhan Neethiraj, > and Pradeep Agrawal. > > > Bugs: RANGER-2362 > https://issues.apache.org/jira/browse/RANGER-2362 > > > Repository: ranger > > > Description > ------- > > RANGER-2362 > > > Here is a simple demo code for discussion. > > Hard-codeed: > we limit 3 failures per 30 minutes. A successful login will reset the counter. > > > BTW: I think the code of RangerAuthenticationProvider is a bit anti-pattern. > > 1. We new RangerAuthenticationProvider at each time user login. It is > unreasonable, it should be a bean. > > see RangerKRBAuthenticationFilter.java and RangerSSOAuthenticationFilter.java > > 2. We new Jdbc/AD/Ldap/Pam authentication provider in > RangerAuthenticationProvider at each time user login. > > 3. The member 'private LdapAuthenticator authenticator' seems useless > > 4. The RangerAuthenticationProvider seem should be replaced with > ProviderManager or something like spring configuration. > > > Diffs > ----- > > security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java > 6b002cff994dd431a83ef46f10ee839fb83dafbb > security-admin/src/main/java/org/apache/ranger/db/XXAuthSessionDao.java > b0270e9d45aa5b5543735318eea4e22683cbfece > > security-admin/src/main/java/org/apache/ranger/security/handler/RangerAuthenticationProvider.java > 8f7abbe7df3d0344c7b5b1af89f7322d82a0d238 > > security-admin/src/main/java/org/apache/ranger/security/listener/SpringEventListener.java > af5622a5f756db931a7173ad01d8c4162d5ee05a > > > Diff: https://reviews.apache.org/r/73898/diff/2/ > > > Testing > ------- > > Self tested > > > Thanks, > > Kirby Zhou > >