Skip to content

Commit

Permalink
userdetail 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
wonwoo committed Oct 29, 2019
1 parent 31fcf45 commit e0400cc
Show file tree
Hide file tree
Showing 12 changed files with 96 additions and 56 deletions.
35 changes: 3 additions & 32 deletions r2dbc/src/main/kotlin/com/example/account/Account.kt
Original file line number Diff line number Diff line change
@@ -1,43 +1,14 @@
package com.example.account

import org.springframework.data.annotation.Id
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.UserDetails
import java.io.Serializable

data class Account(

val name: String,
val username: String,

val passwd: String,
val password: String,

@Id
val id: Long? = null

) : Serializable, UserDetails {

override fun getUsername() = name

override fun isCredentialsNonExpired() = true

override fun isAccountNonExpired() = true

override fun isAccountNonLocked() = true

private fun authorities(account: Account) =

mutableListOf(SimpleGrantedAuthority("ROLE_USER")).apply {

if (account.name == "wonwoo") {

this.add(SimpleGrantedAuthority("ROLE_ADMIN"))

}
}

override fun getAuthorities() = authorities(this)

override fun isEnabled(): Boolean = true

override fun getPassword(): String = passwd
}
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import reactor.core.publisher.Mono
interface AccountRepository : ReactiveCrudRepository<Account, Long> {

//not supported
@Query("select id, name, passwd from account where name = :name")
@Query("select id, username, password from account where username = :username")
fun findByname(name: String): Mono<Account>

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.example.config.service

import com.example.account.Account
import com.example.account.AccountRepository
import com.example.account.UserNotFoundException
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.ReactiveUserDetailsService
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.stereotype.Service
import reactor.core.publisher.Mono
import reactor.kotlin.core.publisher.ofType
import reactor.kotlin.core.publisher.toMono

@Service
Expand All @@ -16,8 +17,38 @@ class ReactiveUserDetailsServiceImpl(private val accountRepository: AccountRepos

return accountRepository.findByname(username)
.switchIfEmpty(UserNotFoundException("not found user name : $username").toMono())
.ofType()
.map { CustomUserDetails(it) }

}

class CustomUserDetails(private val account: Account) : UserDetails {

fun getId() = account.id

override fun getPassword(): String = account.password

private fun authorities() =

mutableListOf(SimpleGrantedAuthority("ROLE_USER")).apply {

if (account.username == "wonwoo") {

this.add(SimpleGrantedAuthority("ROLE_ADMIN"))

}
}

override fun getAuthorities() = authorities()

override fun getUsername(): String = account.username

override fun isAccountNonExpired(): Boolean = true

override fun isAccountNonLocked(): Boolean = true

override fun isCredentialsNonExpired(): Boolean = true

override fun isEnabled(): Boolean = true
}

}
10 changes: 6 additions & 4 deletions r2dbc/src/main/kotlin/com/example/message/MessageController.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.message

import com.example.account.Account
import com.example.config.service.ReactiveUserDetailsServiceImpl.CustomUserDetails
import com.example.formatDateAgo
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.stereotype.Controller
Expand All @@ -20,14 +21,15 @@ class MessageController(private val messageService: MessageService) {
@ModelAttribute("messages")
fun messages() = messageService.findAll()

@ModelAttribute
fun account(@AuthenticationPrincipal account: Account) = account
@ModelAttribute("account")
fun account(@AuthenticationPrincipal account: CustomUserDetails) = account

@GetMapping
fun findAll() = Rendering.view("message").build()

@PostMapping
fun save(@Valid @ModelAttribute messageForm: MessageForm, bindingResult: BindingResult, account: Account): Rendering {
fun save(@Valid @ModelAttribute messageForm: MessageForm, bindingResult: BindingResult,
@ModelAttribute("account") account: CustomUserDetails): Rendering {

if (bindingResult.hasErrors()) {

Expand All @@ -53,7 +55,7 @@ class MessageController(private val messageService: MessageService) {
}
}

fun MessageForm.toMessage(account: Account) = account.id?.let { Message(this.message, it) }
fun MessageForm.toMessage(account: CustomUserDetails) = account.getId()?.let { Message(this.message, it) }

fun Message.toDto(account: Account) = MessageDto(this.message, account, this.regDate.formatDateAgo(), id)

Expand Down
4 changes: 2 additions & 2 deletions r2dbc/src/main/resources/schema.sql
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CREATE TABLE ACCOUNT (
id INTEGER IDENTITY PRIMARY KEY,
name VARCHAR(30),
passwd VARCHAR(256)
username VARCHAR(30),
password VARCHAR(256)
);

CREATE TABLE MESSAGE (
Expand Down
4 changes: 2 additions & 2 deletions r2dbc/src/main/resources/templates/message.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</head>
<body>
<div class="container">
<h1 th:text="'login username : ' + ${account.name}"></h1>
<h1 th:text="'login username : ' + ${account.username}"></h1>

<form role="form" th:action="@{/message}" method="post">
<div class="form-group">
Expand All @@ -45,7 +45,7 @@ <h2>Message</h2>
<tbody>
<tr th:each="message : ${messages}">
<th th:text="${message.message}"></th>
<td th:text="${message.account.name}">Mark</td>
<td th:text="${message.account.username}">Mark</td>
<td th:text="${message.regDate}"></td>
<td><a class="btn btn-default glyphicon" th:attr="onclick=|delete_message('${message.id}')|">Delete</a></td>
</tr>
Expand Down
2 changes: 1 addition & 1 deletion r2dbc/src/test/kotlin/com/example/MockUser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ annotation class MockUser(
}

val authentication = UsernamePasswordAuthenticationToken(
Account(id = customUser.id, name = customUser.username, passwd = customUser.password), "N/A", grantedAuthorities)
Account(id = customUser.id, username = customUser.username, password = customUser.password), "N/A", grantedAuthorities)

return SecurityContextHolder.createEmptyContext().apply {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ class AccountRepositoryTests(private val accountRepository: AccountRepository)
@Test
fun `find by name test`() {

val account = accountRepository.save(Account(name = "fidel", passwd = "foo!@#"))
val account = accountRepository.save(Account(username = "fidel", password = "foo!@#"))
.flatMap {
accountRepository.findByname("fidel")
}

account.test().assertNext {

assertThat(it.name).isEqualTo("fidel")
assertThat(it.passwd).isEqualTo("foo!@#")
assertThat(it.username).isEqualTo("fidel")
assertThat(it.password).isEqualTo("foo!@#")

}.verifyComplete()

Expand Down
4 changes: 2 additions & 2 deletions r2dbc/src/test/kotlin/com/example/account/AccountTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class AccountTest(private val accountRepository: AccountRepository) {

saved.test().assertNext {

assertThat(it.name).isEqualTo("wonwoo")
assertThat(it.passwd).isEqualTo("pass123")
assertThat(it.username).isEqualTo("wonwoo")
assertThat(it.password).isEqualTo("pass123")

}.verifyComplete()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ internal class ReactiveUserDetailsServiceImplTests(@Mock private val accountRepo
@Test
fun `find by username test`() {
given(accountRepository.findByname(any()))
.willReturn(Mono.just(Account(name = "wonwoo", passwd = "123123")))
.willReturn(Mono.just(Account(username = "wonwoo", password = "123123")))


val userDetails = reactiveUserDetailsService.findByUsername("wonwoo")
Expand All @@ -42,7 +42,6 @@ internal class ReactiveUserDetailsServiceImplTests(@Mock private val accountRepo

}.verifyComplete()


}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,47 @@
package com.example.config.service

import com.example.account.Account
import com.example.account.AccountRepository
import com.example.account.UserNotFoundException
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.stereotype.Service

@Service
class UserDetailsServiceImpl(private val accountRepository: AccountRepository) : UserDetailsService {

override fun loadUserByUsername(username: String) = accountRepository.findByname(username)
?: throw UserNotFoundException("not found user name : $username")
?.let {
CustomUserDetails(it)
} ?: throw UserNotFoundException("not found user name : $username")


class CustomUserDetails(val account: Account) : UserDetails {

override fun getPassword(): String = account.password

private fun authorities() =

mutableListOf(SimpleGrantedAuthority("ROLE_USER")).apply {

if (account.username == "wonwoo") {

this.add(SimpleGrantedAuthority("ROLE_ADMIN"))

}
}

override fun getAuthorities() = authorities()

override fun getUsername(): String = account.username

override fun isAccountNonExpired(): Boolean = true

override fun isAccountNonLocked(): Boolean = true

override fun isCredentialsNonExpired(): Boolean = true

override fun isEnabled(): Boolean = true
}
}
11 changes: 7 additions & 4 deletions web/src/main/kotlin/com/example/message/MessageController.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.example.message

import com.example.account.Account
import com.example.config.service.UserDetailsServiceImpl
import com.example.config.service.UserDetailsServiceImpl.CustomUserDetails
import com.example.formatDateAgo
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.stereotype.Controller
Expand All @@ -15,14 +17,15 @@ class MessageController(private val messageService: MessageService) {
@ModelAttribute("messages")
fun messages() = messageService.findAll().map { it.toDto() }

@ModelAttribute
fun account(@AuthenticationPrincipal account: Account) = account
@ModelAttribute("account")
fun account(@AuthenticationPrincipal account: CustomUserDetails) = account

@GetMapping
fun findAll() = "message"

@PostMapping
fun save(@Valid @ModelAttribute messageForm: MessageForm, bindingResult: BindingResult, account: Account): String {
fun save(@Valid @ModelAttribute messageForm: MessageForm, bindingResult: BindingResult,
@ModelAttribute("account") account: CustomUserDetails): String {

if (bindingResult.hasErrors()) {

Expand All @@ -46,7 +49,7 @@ class MessageController(private val messageService: MessageService) {
}
}

fun MessageForm.toMessage(account: Account) = Message(this.message, account)
fun MessageForm.toMessage(account: CustomUserDetails) = Message(this.message, account.account)

fun Message.toDto() = MessageDto(this.message, this.account, this.regDate.formatDateAgo(), id)

Expand Down

0 comments on commit e0400cc

Please sign in to comment.