Nano Hash - криптовалюты, майнинг, программирование

KTOR: Как я могу найти информацию о местоположении до обработки звонка?

Я сделал настраиваемую функцию, которая должна проверять права пользователя на использование запроса. Могу ли я отслеживать запрос LocationInfo? Может это так выглядит?

if (!User.accessTo.contains(CALL_LOCATION_INFO)){
call.respond(HttpStatusCode.BadRequest) }

Это мой код функции:

data class UserRights(
        val haveFullAccess:Boolean,
        val accessTo:List<String>,
        val canUpdate:Boolean,
        val canDelete:Boolean,
        val canBan:Boolean,
        val canMute:Boolean)

var User = UserRights(false, listOf(""),false,false,false,false)

class RightsChecker(configuration: Configuration) {
    val prop = configuration.prop // get snapshot of config into immutable property
    class Configuration {
        var prop = "value"
    }
    companion object Feature : ApplicationFeature<ApplicationCallPipeline, Configuration, RightsChecker> {
        override val key = AttributeKey<RightsChecker>("RightsChecker")
        override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.() -> Unit): RightsChecker {
            val configuration = RightsChecker.Configuration().apply(configure)
            val feature = RightsChecker(configuration)

            val FilterPhase = PipelinePhase("CallFilter")
            pipeline.insertPhaseAfter(ApplicationCallPipeline.Infrastructure, FilterPhase)

            pipeline.intercept(FilterPhase) {
                val session = call.sessions.get<SessionData>() ?: SessionData(0, "Guest")
                when (session.role) {
                    "Guest" -> User = UserRights(
                            haveFullAccess = false,
                            accessTo = listOf(""),
                            canUpdate = false,
                            canDelete = false,
                            canBan = false,
                            canMute = false)
                    "User" -> User = UserRights(
                            haveFullAccess = false,
                            accessTo = listOf("lUsers"),
                            canUpdate = false,
                            canDelete = false,
                            canBan = false,
                            canMute = false)                       
                    "Admin" -> User = UserRights(
                            haveFullAccess = true,
                            accessTo = listOf("lUsers"),
                            canUpdate = true,
                            canDelete = true,
                            canBan = true,
                            canMute = true)
                }
                if (!User.accessTo.contains(CALL_LOCATION_INFO)){
                    call.respond(HttpStatusCode.BadRequest)
                }
            }
            return feature
        }
    }
}

Как видите, я использую класс данных UserRights с правами в нем. «accesTo» - это список названий локаций (формат можно изменить), которые может использовать пользователь. Перед обработкой запроса функция должна просто проверить имя локации в списке "accesTo".

Спасибо за помощь!

UPD: Код локаций:

@Location("/login") data class lLoginData(val email:String, val password: String)
@Location("/users") data class lGetUsers(val page:Int, val limit:Int)
@Location("/users/user") data class lUser(val email: String)
@Location("/users") data class lUpdateData(val userID: Int, val datatype:String, val newData:String)
@Location("/users") data class lRegData(val email: String, val username:String, val userpass:String)
06.08.2018

Ответы:


1

Если я вас правильно понял, то вы просто хотите знать, какой маршрут / uri был вызван.

Вот небольшой сервер, который отвечает по названному маршруту.

private val locationKey = AttributeKey ("местоположение")

val module = fun Application.() {
    install(Routing) {
        intercept(ApplicationCallPipeline.Call) {
            val location = call.request.local.uri
            call.attributes.put(locationKey, location)
        }

        get("{...}") {
            val location = call.attributes[locationKey]
            call.respond(location)
        }
    }
}

Как видно, я использую call.request.local.uri, чтобы получить uri вызова.

Когда я перехожу к http://localhost:5001/hello/route, сервер отвечает /hello/route.

Отвечает ли это на ваш вопрос?

07.08.2018
  • Не совсем то, что мне нужно. У меня разные местоположения в одном URL. Мне нужна именно информация о местоположении. (Я добавил в сообщение код @Location) 08.08.2018
  • Вы можете объяснить, что CALL_LOCATION_INFO могло бы быть? 08.08.2018
  • Я нашел. call.route.parent. выглядит как / user / {user_id} (например, URL выглядит как / user / user_id = 9572) 09.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..