add Services
This commit is contained in:
parent
58b3df11f0
commit
35948e1b87
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -1,147 +1,108 @@
|
|||||||
import model.AdminUser
|
import model.AdminUser
|
||||||
import model.ManagerUser
|
|
||||||
import model.DefaultUser
|
import model.DefaultUser
|
||||||
|
import model.ManagerUser
|
||||||
import model.User
|
import model.User
|
||||||
|
import service.AdminServiceImpl
|
||||||
|
import service.AuthorizeService
|
||||||
|
import service.PasswordService
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import javax.crypto.SecretKeyFactory
|
|
||||||
import javax.crypto.spec.PBEKeySpec
|
|
||||||
import java.util.Base64
|
|
||||||
|
|
||||||
|
|
||||||
val authorizationList = mutableListOf<User>()
|
val authorizationList = mutableListOf<User>()
|
||||||
|
|
||||||
|
|
||||||
private const val HASH_LENGTH = 256
|
|
||||||
private const val ITERATIONS = 65536
|
|
||||||
val salt = "sosalt"
|
|
||||||
|
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
|
val passwordService = PasswordService()
|
||||||
|
val adminService = AdminServiceImpl(authorizationList, passwordService)
|
||||||
|
val authorizeService = AuthorizeService(authorizationList, passwordService)
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
println("1) Регаться тут")
|
println("1) Регистрация")
|
||||||
println("2) Авторизироваться тут")
|
println("2) Авторизация")
|
||||||
var choice = readln()
|
val choice = readln()
|
||||||
if (choice == "1") {
|
when (choice) {
|
||||||
authorizationList.add(registration())
|
"1" -> {
|
||||||
authorizationList.forEach{
|
val user = createUser(passwordService)
|
||||||
println(it.userId)
|
val registered = authorizeService.registration(user)
|
||||||
println(it.login)
|
if (registered) {
|
||||||
println(it.password)
|
println("Регистрация успешна")
|
||||||
println(it.email)
|
} else {
|
||||||
println(it.lastAuthorizeDate)
|
println("Пользователь с таким email или логином уже существует")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
"2" -> {
|
||||||
else {
|
try {
|
||||||
println(authorization())
|
println("Введите email:")
|
||||||
|
val email = readln()
|
||||||
|
println("Введите пароль:")
|
||||||
|
val password = readln()
|
||||||
|
val user = authorizeService.authorize(email, password)
|
||||||
|
println("Пользователь найден: ${user.login}, тип: ${user::class.simpleName}")
|
||||||
|
|
||||||
|
if (user is AdminUser) {
|
||||||
|
var adminFlg = true
|
||||||
|
while (adminFlg) {
|
||||||
|
adminFlg = adminFunctional(adminService)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: IllegalArgumentException) {
|
||||||
|
println(e.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> println("Неверный выбор")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createUser(passwordService: PasswordService): User {
|
||||||
|
println("Введите email:")
|
||||||
|
val email = readln()
|
||||||
|
require(email.contains("@")) { "Email должен содержать '@'" }
|
||||||
|
|
||||||
fun hashPassword(password: String, salt: String): String {
|
println("Введите пароль:")
|
||||||
val saltBytes = Base64.getDecoder().decode(salt)
|
val password = readln()
|
||||||
val spec = PBEKeySpec(password.toCharArray(), saltBytes, ITERATIONS, HASH_LENGTH)
|
require(password.length >= 8 && password.any { it.isDigit() } && password.any { it.isLetter() }) {
|
||||||
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
|
"Пароль должен быть не менее 8 символов и содержать буквы и цифры"
|
||||||
val hash = factory.generateSecret(spec).encoded
|
|
||||||
return Base64.getEncoder().encodeToString(hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun registration(): User{
|
|
||||||
println("Почту пиши")
|
|
||||||
val user_Email = readlnOrNull()
|
|
||||||
checkNotNull(user_Email)
|
|
||||||
require(user_Email.contains("@")) {
|
|
||||||
"Добавь @"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
println("Пароль пиши")
|
println("Повторите пароль:")
|
||||||
val user_Password = readlnOrNull()
|
val confirmPassword = readln()
|
||||||
checkNotNull(user_Password)
|
require(password == confirmPassword) { "Пароли не совпадают" }
|
||||||
require(user_Password.length >= 8 &&
|
|
||||||
user_Password.any { it.isDigit() } &&
|
|
||||||
user_Password.any { it.isLetter() && it in 'a'..'z' || it in 'A'..'Z' }
|
|
||||||
) {
|
|
||||||
"Длинее делай или цифру/букву добавляй"
|
|
||||||
}
|
|
||||||
|
|
||||||
println("Заново пароль пиши")
|
println("Введите логин:")
|
||||||
val user_Password1 = readlnOrNull()
|
val login = readln()
|
||||||
checkNotNull(user_Password1)
|
require(login.length >= 4) { "Логин должен быть не менее 4 символов" }
|
||||||
require(user_Password1 == user_Password) {
|
|
||||||
"Ну ты и тупорылый"
|
|
||||||
}
|
|
||||||
|
|
||||||
println("Логин пиши")
|
println("Выберите роль: 1) Обычный пользователь 2) Администратор 3) Менеджер")
|
||||||
val user_Login = readlnOrNull()
|
val role = readln()
|
||||||
checkNotNull(user_Login)
|
|
||||||
require(user_Login.length >= 4) {
|
|
||||||
"Длинее делай"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
val hashedPassword = passwordService.hashPassword(password)
|
||||||
|
|
||||||
println("ТЫ КТО? 1) лох 2) админо 3) манагер")
|
return when (role) {
|
||||||
val role = readlnOrNull()
|
"1" -> DefaultUser(
|
||||||
checkNotNull(role)
|
|
||||||
|
|
||||||
return when(role) {
|
|
||||||
"1" -> return DefaultUser(
|
|
||||||
userId = authorizationList.size + 1,
|
userId = authorizationList.size + 1,
|
||||||
login = user_Login,
|
login = login,
|
||||||
password = hashPassword(user_Password, salt),
|
password = hashedPassword,
|
||||||
email = user_Email,
|
email = email,
|
||||||
lastAuthorizeDate = LocalDate.now()
|
lastAuthorizeDate = LocalDate.now()
|
||||||
)
|
)
|
||||||
|
"2" -> AdminUser(
|
||||||
"2" -> return AdminUser(
|
|
||||||
userId = authorizationList.size + 1,
|
userId = authorizationList.size + 1,
|
||||||
login = user_Login,
|
login = login,
|
||||||
password = hashPassword(user_Password, salt),
|
password = hashedPassword,
|
||||||
email = user_Email,
|
email = email,
|
||||||
lastAuthorizeDate = LocalDate.now()
|
lastAuthorizeDate = LocalDate.now()
|
||||||
)
|
)
|
||||||
|
"3" -> ManagerUser(
|
||||||
"3" -> return ManagerUser(
|
|
||||||
userId = authorizationList.size + 1,
|
userId = authorizationList.size + 1,
|
||||||
login = user_Login,
|
login = login,
|
||||||
password = hashPassword(user_Password, salt),
|
password = hashedPassword,
|
||||||
email = user_Email,
|
email = email,
|
||||||
lastAuthorizeDate = LocalDate.now()
|
lastAuthorizeDate = LocalDate.now()
|
||||||
)
|
)
|
||||||
|
else -> throw IllegalArgumentException("Некорректный выбор роли")
|
||||||
else -> { throw IllegalArgumentException("error") }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun adminFunctional(adminService: AdminServiceImpl): Boolean {
|
||||||
fun authorization(): String{
|
|
||||||
var adminFlg = true
|
|
||||||
println("Почту пиши")
|
|
||||||
val user_Email = readlnOrNull()
|
|
||||||
checkNotNull(user_Email)
|
|
||||||
val user = authorizationList.find { it.email == user_Email }
|
|
||||||
require(user != null) {
|
|
||||||
"нет такого"
|
|
||||||
}
|
|
||||||
|
|
||||||
println("Пароль пиши")
|
|
||||||
val user_Password = readlnOrNull()
|
|
||||||
checkNotNull(user_Password)
|
|
||||||
require(user.password == hashPassword(user_Password, salt)) {
|
|
||||||
"не то"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user is AdminUser) {
|
|
||||||
while (adminFlg == true) {
|
|
||||||
adminFlg = adminFunctional(user)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "такой есть"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun adminFunctional(user: AdminUser): Boolean {
|
|
||||||
println("1) Показать всех")
|
println("1) Показать всех")
|
||||||
println("2) Показать всех сорт")
|
println("2) Показать всех сорт")
|
||||||
println("3) Поменять пароль")
|
println("3) Поменять пароль")
|
||||||
@ -150,13 +111,32 @@ fun adminFunctional(user: AdminUser): Boolean {
|
|||||||
|
|
||||||
var flg = readln()
|
var flg = readln()
|
||||||
when(flg) {
|
when(flg) {
|
||||||
"1" -> user.allUsers(authorizationList)
|
"1" -> {
|
||||||
"2" -> user.allUsersSort(authorizationList)
|
adminService.getAllUsers().forEach {
|
||||||
"3" -> user.updateUserPassword(authorizationList)
|
println("${it.userId}: ${it.login} (${it.email})")
|
||||||
"4" -> user.removeUser(authorizationList)
|
}
|
||||||
|
}
|
||||||
|
"2" -> {
|
||||||
|
adminService.getAllUsersSort().forEach {
|
||||||
|
println("${it.userId}: ${it.login} (${it.lastAuthorizeDate})")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"3" -> {
|
||||||
|
println("Введите email пользователя для обновления пароля")
|
||||||
|
val email = readln()
|
||||||
|
println("Введите новый пароль")
|
||||||
|
val newPassword = readln()
|
||||||
|
val updated = adminService.updateUserPassword(email, newPassword)
|
||||||
|
if (updated) println("Пароль обновлен") else println("Пользователь не найден")
|
||||||
|
}
|
||||||
|
"4" -> {
|
||||||
|
println("Введите ID пользователя для удаления")
|
||||||
|
val userId = readln().toInt()
|
||||||
|
val removed = adminService.removeUserById(userId)
|
||||||
|
if (removed) println("Пользователь удален") else println("Пользователь не найден")
|
||||||
|
}
|
||||||
"5" -> return false
|
"5" -> return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import hashPassword
|
|
||||||
import salt
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
|
|
||||||
class AdminUser(
|
class AdminUser(
|
||||||
@ -10,42 +8,4 @@ class AdminUser(
|
|||||||
password: String,
|
password: String,
|
||||||
email: String,
|
email: String,
|
||||||
lastAuthorizeDate: LocalDate,
|
lastAuthorizeDate: LocalDate,
|
||||||
): User(userId, login, password, email, lastAuthorizeDate), IAdminUser {
|
): User(userId, login, password, email, lastAuthorizeDate)
|
||||||
|
|
||||||
override fun allUsers(authorizationList: MutableList<User>) {
|
|
||||||
for (user in authorizationList) {
|
|
||||||
println(user.login)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun allUsersSort(authorizationList: MutableList<User>) {
|
|
||||||
authorizationList.sortByDescending { it.lastAuthorizeDate }
|
|
||||||
for (user in authorizationList) {
|
|
||||||
println(user.login + " зашел в " + user.lastAuthorizeDate)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun updateUserPassword(authorizationList: MutableList<User>) {
|
|
||||||
println("Почту пиши для апдейта")
|
|
||||||
val email = readln()
|
|
||||||
println("Пароль пиши для апдейта")
|
|
||||||
val password = readln()
|
|
||||||
|
|
||||||
val user = authorizationList.find { it.email == email }
|
|
||||||
require(user != null) {
|
|
||||||
"нет такого"
|
|
||||||
}
|
|
||||||
|
|
||||||
user.password = hashPassword(password, salt)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun removeUser(authorizationList: MutableList<User>) {
|
|
||||||
println("Почту пиши для апдейта")
|
|
||||||
val email = readln()
|
|
||||||
|
|
||||||
val removed = authorizationList.removeIf { it.email == email }
|
|
||||||
if (removed) {
|
|
||||||
println("удалили")
|
|
||||||
} else { println("не удалили") }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
interface IAdminUser {
|
|
||||||
fun allUsers(authorizationList: MutableList<User>)
|
|
||||||
fun allUsersSort(authorizationList: MutableList<User>)
|
|
||||||
fun updateUserPassword(authorizationList: MutableList<User>)
|
|
||||||
fun removeUser(authorizationList: MutableList<User>)
|
|
||||||
}
|
|
28
src/main/kotlin/service/AdminServiceImpl.kt
Normal file
28
src/main/kotlin/service/AdminServiceImpl.kt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import model.User
|
||||||
|
|
||||||
|
class AdminServiceImpl(private val authorizationList: MutableList<User>, private val passwordService: IPasswordService) : IAdminService {
|
||||||
|
|
||||||
|
override fun getAllUsers(): List<User> {
|
||||||
|
return authorizationList.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAllUsersSort(): List<User> {
|
||||||
|
return authorizationList.sortedByDescending { it.lastAuthorizeDate }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateUserPassword(email: String, newPassword: String): Boolean {
|
||||||
|
val user = authorizationList.find { it.email == email }
|
||||||
|
require(user != null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
user.password = passwordService.hashPassword(newPassword)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun removeUserById(userId: Int): Boolean {
|
||||||
|
return authorizationList.removeIf { it.userId == userId }
|
||||||
|
}
|
||||||
|
}
|
30
src/main/kotlin/service/AuthorizeService.kt
Normal file
30
src/main/kotlin/service/AuthorizeService.kt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import model.User
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
class AuthorizeService(
|
||||||
|
private val authorizationList: MutableList<User>,
|
||||||
|
private val passwordService: IPasswordService
|
||||||
|
) : IAuthorizeService {
|
||||||
|
|
||||||
|
override fun registration(user: User): Boolean {
|
||||||
|
if (authorizationList.any { it.email == user.email || it.login == user.login }) {
|
||||||
|
return false // Пользователь с таким email или логином уже существует
|
||||||
|
}
|
||||||
|
authorizationList.add(user)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun authorize(email: String, password: String): User {
|
||||||
|
val user = authorizationList.find { it.email == email }
|
||||||
|
?: throw IllegalArgumentException("Пользователь с таким email не найден")
|
||||||
|
|
||||||
|
if (!passwordService.matches(password, user.password)) {
|
||||||
|
throw IllegalArgumentException("Неверный пароль")
|
||||||
|
}
|
||||||
|
|
||||||
|
user.lastAuthorizeDate = LocalDate.now()
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
}
|
10
src/main/kotlin/service/IAdminService.kt
Normal file
10
src/main/kotlin/service/IAdminService.kt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import model.User
|
||||||
|
|
||||||
|
interface IAdminService {
|
||||||
|
fun getAllUsers(): List<User>
|
||||||
|
fun getAllUsersSort(): List<User>
|
||||||
|
fun updateUserPassword(email: String, newPassword: String): Boolean
|
||||||
|
fun removeUserById(userId: Int): Boolean
|
||||||
|
}
|
8
src/main/kotlin/service/IAuthorizeService.kt
Normal file
8
src/main/kotlin/service/IAuthorizeService.kt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import model.User
|
||||||
|
|
||||||
|
interface IAuthorizeService {
|
||||||
|
fun registration(user: User): Boolean
|
||||||
|
fun authorize(email: String, password: String): User
|
||||||
|
}
|
6
src/main/kotlin/service/IPasswordService.kt
Normal file
6
src/main/kotlin/service/IPasswordService.kt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
interface IPasswordService {
|
||||||
|
fun hashPassword(password: String): String
|
||||||
|
fun matches(password: String, hashedPassword: String): Boolean
|
||||||
|
}
|
24
src/main/kotlin/service/PasswordService.kt
Normal file
24
src/main/kotlin/service/PasswordService.kt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
import javax.crypto.SecretKeyFactory
|
||||||
|
import javax.crypto.spec.PBEKeySpec
|
||||||
|
|
||||||
|
class PasswordService : IPasswordService{
|
||||||
|
private val HASH_LENGTH = 256
|
||||||
|
private val ITERATIONS = 65536
|
||||||
|
private val salt = "sosalt"
|
||||||
|
|
||||||
|
override fun hashPassword(password: String): String {
|
||||||
|
val saltBytes = Base64.getDecoder().decode(salt)
|
||||||
|
val spec = PBEKeySpec(password.toCharArray(), saltBytes, ITERATIONS, HASH_LENGTH)
|
||||||
|
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
|
||||||
|
val hash = factory.generateSecret(spec).encoded
|
||||||
|
return Base64.getEncoder().encodeToString(hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun matches(password: String, hashedPassword: String): Boolean {
|
||||||
|
val hash = hashPassword(password)
|
||||||
|
return hash == hashedPassword
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user