Skip to content

Commit

Permalink
SHIBUI-2568
Browse files Browse the repository at this point in the history
Adding tracking of logins for use in telemetry reporting
  • Loading branch information
chasegawa committed Jun 2, 2023
1 parent 2ee9694 commit 6914a08
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ public User getCurrentUser(Principal principal) {
return userService.getCurrentUser();
}

@PreAuthorize("hasRole('ADMIN')")
@Transactional(readOnly = true)
@GetMapping("/loginCount")
public int getDailyLoginCount() {
return userService.getDailyLoginCount();
}

@PreAuthorize("hasRole('ADMIN')")
@Transactional(readOnly = true)
@GetMapping("/{username}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import edu.internet2.tier.shibboleth.admin.ui.security.model.UserLoginRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.Date;
import java.util.Optional;

public interface UserLoginRecordRepository extends JpaRepository<UserLoginRecord, Long> {
Optional<UserLoginRecord> findByUsernameAndLogin(String username, String formattedDate);

@Query(value = "SELECT count(*) FROM UserLoginRecord ulr WHERE ulr.loginDate >= :sinceDate")
int countLoginsSince(@Param("sinceDate") Date sinceDate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
import edu.internet2.tier.shibboleth.admin.ui.security.repository.UserRepository;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
Expand Down Expand Up @@ -261,4 +263,9 @@ public void updateLoginRecord(String username) {
userLoginRecordRepository.saveAndFlush(ulr);
}
}

public int getDailyLoginCount() {
Date since = DateUtils.addDays(new Date(), -1);
return userLoginRecordRepository.countLoginsSince(since);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import edu.internet2.tier.shibboleth.admin.ui.security.model.Ownership
import edu.internet2.tier.shibboleth.admin.ui.security.model.Role
import edu.internet2.tier.shibboleth.admin.ui.security.model.User
import edu.internet2.tier.shibboleth.admin.ui.security.model.UserLoginRecord
import org.apache.commons.lang.time.DateUtils

import java.text.SimpleDateFormat

Expand Down Expand Up @@ -193,12 +194,24 @@ class UserServiceTests extends AbstractBaseDataJpaTest {
then:
userLoginRecordRepository.findByUsernameAndLogin("username", formattedDate).isPresent()
userLoginRecordRepository.count() == 1
userService.getDailyLoginCount() == 1

when:
userService.updateLoginRecord("username2")

then:
userLoginRecordRepository.findByUsernameAndLogin("username2", formattedDate).isPresent()
userLoginRecordRepository.count() == 2
userService.getDailyLoginCount() == 2

when: 'older logins in db, should be same counts'
Date older = DateUtils.addDays(new Date(), -3)
String formattedDate2 = DATE_FORMAT.format(older)
UserLoginRecord ulr2 = new UserLoginRecord("username", older, formattedDate2)
userLoginRecordRepository.save(ulr2)

then:
userLoginRecordRepository.count() == 3
userService.getDailyLoginCount() == 2
}
}

0 comments on commit 6914a08

Please sign in to comment.