Skip to content

Commit

Permalink
Store user's firstname and lastname in DB
Browse files Browse the repository at this point in the history
  • Loading branch information
HenningCash committed Oct 25, 2019
1 parent c5027e2 commit c4decca
Show file tree
Hide file tree
Showing 9 changed files with 64 additions and 28 deletions.
6 changes: 2 additions & 4 deletions src/main/kotlin/de/code_freak/codefreak/auth/AppUser.kt
Expand Up @@ -6,13 +6,11 @@ import org.springframework.security.core.userdetails.User as SpringUser
class AppUser(
val entity: User,
roles: Collection<Role>,
password: String = "",
firstName: String? = null,
lastName: String? = null
password: String = ""
) : SpringUser(
entity.username,
password,
roles.flatMap { it.allGrantedAuthorities }
) {
val displayName = listOfNotNull(firstName, lastName).ifEmpty { listOf(username) }.joinToString(" ")
val displayName = listOfNotNull(entity.firstName, entity.lastName).ifEmpty { listOf(username) }.joinToString(" ")
}
@@ -1,8 +1,7 @@
package de.code_freak.codefreak.auth

import de.code_freak.codefreak.config.AppConfiguration
import de.code_freak.codefreak.entity.User
import de.code_freak.codefreak.repository.UserRepository
import de.code_freak.codefreak.service.UserService
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.ldap.core.DirContextAdapter
Expand All @@ -16,7 +15,7 @@ import org.springframework.stereotype.Component
class LdapUserDetailsContextMapper : UserDetailsContextMapper {

@Autowired
private lateinit var userRepository: UserRepository
private lateinit var userService: UserService

@Autowired
private lateinit var config: AppConfiguration
Expand Down Expand Up @@ -50,11 +49,11 @@ class LdapUserDetailsContextMapper : UserDetailsContextMapper {
}
}

val user = userRepository.findByUsernameIgnoreCase(username!!).orElseGet { userRepository.save(User(username)) }
val user = userService.getOrCreateUser(username!!) {
firstName = config.ldap.firstNameAttribute?.let { ctx?.getStringAttribute(it) }
lastName = config.ldap.lastNameAttribute?.let { ctx?.getStringAttribute(it) }
}
log.debug("Logging in ${user.username} with roles $roles")
return AppUser(user, roles,
firstName = config.ldap.firstNameAttribute?.let { ctx?.getStringAttribute(it) },
lastName = config.ldap.lastNameAttribute?.let { ctx?.getStringAttribute(it) }
)
return AppUser(user, roles)
}
}
Expand Up @@ -3,14 +3,13 @@ package de.code_freak.codefreak.auth.lti
import com.nimbusds.jwt.JWTClaimsSet
import de.code_freak.codefreak.auth.AppUser
import de.code_freak.codefreak.auth.Role
import de.code_freak.codefreak.entity.User
import de.code_freak.codefreak.repository.UserRepository
import de.code_freak.codefreak.service.UserService
import org.mitre.openid.connect.client.OIDCAuthenticationProvider
import org.mitre.openid.connect.model.PendingOIDCAuthenticationToken
import org.slf4j.LoggerFactory
import org.springframework.security.core.Authentication

class LtiAuthenticationProvider(private val userRepository: UserRepository) : OIDCAuthenticationProvider() {
class LtiAuthenticationProvider(private val userService: UserService) : OIDCAuthenticationProvider() {

private val log = LoggerFactory.getLogger(this::class.java)

Expand Down Expand Up @@ -41,13 +40,12 @@ class LtiAuthenticationProvider(private val userRepository: UserRepository) : OI

private fun buildAppUser(claims: JWTClaimsSet, roles: List<Role>): AppUser {
val username = claims.getStringClaim("email")
val user = userRepository.findByUsernameIgnoreCase(username!!).orElseGet { userRepository.save(User(username)) }
val user = userService.getOrCreateUser(username) {
firstName = claims.getStringClaim("given_name")
lastName = claims.getStringClaim("family_name")
}
log.debug("Logging in ${user.username} with roles $roles")
return AppUser(
user, roles,
firstName = claims.getStringClaim("given_name"),
lastName = claims.getStringClaim("family_name")
)
return AppUser(user, roles)
}

private fun buildAuthorities(claims: JWTClaimsSet): List<Role> {
Expand Down
Expand Up @@ -6,7 +6,7 @@ import de.code_freak.codefreak.auth.lti.IdCodeAuthRequestBuilder
import de.code_freak.codefreak.auth.lti.LtiAuthenticationFilter
import de.code_freak.codefreak.auth.lti.LtiAuthenticationProvider
import de.code_freak.codefreak.auth.lti.LtiAuthenticationSuccessHandler
import de.code_freak.codefreak.repository.UserRepository
import de.code_freak.codefreak.service.UserService
import org.mitre.jwt.signer.service.JWTSigningAndValidationService
import org.mitre.jwt.signer.service.impl.DefaultJWTSigningAndValidationService
import org.mitre.oauth2.model.ClientDetailsEntity
Expand Down Expand Up @@ -37,7 +37,7 @@ import java.security.KeyStore
@Order(1)
class LtiSecurityConfiguration(
@Autowired appConfiguration: AppConfiguration,
@Autowired val userRepository: UserRepository
@Autowired val userService: UserService
) : WebSecurityConfigurerAdapter() {
val config = appConfiguration.lti
private val ltiLoginPath = "/lti/login"
Expand Down Expand Up @@ -68,7 +68,7 @@ class LtiSecurityConfiguration(
}

override fun configure(auth: AuthenticationManagerBuilder?) {
auth?.authenticationProvider(LtiAuthenticationProvider(userRepository))
auth?.authenticationProvider(LtiAuthenticationProvider(userService))
}

@Bean
Expand Down
6 changes: 5 additions & 1 deletion src/main/kotlin/de/code_freak/codefreak/entity/User.kt
Expand Up @@ -3,4 +3,8 @@ package de.code_freak.codefreak.entity
import javax.persistence.Entity

@Entity
class User(val username: String) : BaseEntity()
class User(
val username: String,
var firstName: String? = null,
var lastName: String? = null
) : BaseEntity()
Expand Up @@ -40,9 +40,9 @@ class SeedDatabaseService : ApplicationListener<ContextRefreshedEvent>, Ordered
private val log = LoggerFactory.getLogger(this::class.java)

companion object {
val admin = User("admin")
val teacher = User("teacher")
val student = User("student")
val admin = User("admin", "John", "Admin")
val teacher = User("teacher", "Kim", "Teacher")
val student = User("student", "Alice", "Student")
}

override fun onApplicationEvent(event: ContextRefreshedEvent) {
Expand Down
20 changes: 20 additions & 0 deletions src/main/kotlin/de/code_freak/codefreak/service/UserService.kt
@@ -0,0 +1,20 @@
package de.code_freak.codefreak.service

import de.code_freak.codefreak.entity.User
import de.code_freak.codefreak.repository.UserRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import javax.transaction.Transactional

@Service
class UserService : BaseService() {
@Autowired
private lateinit var userRepository: UserRepository

@Transactional
fun getOrCreateUser(username: String, patch: User.() -> Unit): User {
val user = userRepository.findByUsernameIgnoreCase(username).orElseGet { userRepository.save(User(username)) }
user.patch()
return user
}
}
3 changes: 3 additions & 0 deletions src/main/resources/db/changelog-master.yaml
Expand Up @@ -2,3 +2,6 @@ databaseChangeLog:
- include:
file: changelogs/20191002162627-initial.yaml
relativeToChangelogFile: true
- include:
file: changelogs/20191025095704-user-firstname-and-lastname.yaml
relativeToChangelogFile: true
@@ -0,0 +1,14 @@
databaseChangeLog:
- changeSet:
id: 1571990279058-1
author: hkasch
changes:
- addColumn:
columns:
- column:
name: first_name
type: varchar(255)
- column:
name: last_name
type: varchar(255)
tableName: user

0 comments on commit c4decca

Please sign in to comment.