首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Scala Play Framework和Silhouette验证失败时如何记录用户凭据

使用Scala Play Framework和Silhouette进行验证时,可以通过以下步骤记录用户凭据的验证失败:

  1. 首先,确保已经在项目中添加了Scala Play Framework和Silhouette的依赖。
  2. 创建一个自定义的验证失败处理器(FailureHandler),用于记录用户凭据的验证失败。可以继承Silhouette提供的DefaultFailureHandler,并重写handle方法。
代码语言:txt
复制
import com.mohiva.play.silhouette.api.actions.SecuredErrorHandler
import com.mohiva.play.silhouette.api.{ Logger, RequestProvider }
import com.mohiva.play.silhouette.impl.exceptions.{ IdentityNotFoundException, InvalidPasswordException }
import com.mohiva.play.silhouette.impl.providers.CredentialsProvider
import play.api.mvc.{ RequestHeader, Result }

import scala.concurrent.Future

class CustomSecuredErrorHandler extends SecuredErrorHandler with Logger {

  override def onNotAuthenticated(implicit request: RequestHeader): Future[Result] = {
    // 记录用户凭据验证失败的日志
    logger.error(s"Authentication failed for ${request.remoteAddress}")
    Future.successful(Results.Unauthorized)
  }

  override def onNotAuthorized(implicit request: RequestHeader): Future[Result] = {
    // 记录用户凭据验证失败的日志
    logger.error(s"Authorization failed for ${request.remoteAddress}")
    Future.successful(Results.Forbidden)
  }
}
  1. 在应用程序的配置文件(application.conf)中配置自定义的验证失败处理器。
代码语言:txt
复制
silhouette {
  errorHandler = "com.example.CustomSecuredErrorHandler"
}
  1. 确保在应用程序的路由文件(routes)中定义了登录和验证的路由。
代码语言:txt
复制
GET     /login                  controllers.AuthenticationController.login
POST    /authenticate           controllers.AuthenticationController.authenticate
  1. 创建一个身份验证控制器(AuthenticationController),用于处理登录和验证请求。
代码语言:txt
复制
import com.mohiva.play.silhouette.api.Silhouette
import com.mohiva.play.silhouette.api.util.Credentials
import com.mohiva.play.silhouette.impl.providers.CredentialsProvider
import javax.inject.Inject
import play.api.mvc.{ AbstractController, ControllerComponents }

import scala.concurrent.{ ExecutionContext, Future }

class AuthenticationController @Inject()(
  cc: ControllerComponents,
  silhouette: Silhouette[UserEnv],
  credentialsProvider: CredentialsProvider
)(implicit ec: ExecutionContext) extends AbstractController(cc) {

  def login = Action.async { implicit request =>
    Future.successful(Ok(views.html.login()))
  }

  def authenticate = Action.async { implicit request =>
    val credentials = Credentials(
      request.body.asFormUrlEncoded.get("email").head,
      request.body.asFormUrlEncoded.get("password").head
    )

    credentialsProvider.authenticate(credentials).flatMap { loginInfo =>
      silhouette.env.userService.retrieve(loginInfo).flatMap {
        case Some(user) => silhouette.env.authenticatorService.create(loginInfo).map {
          case authenticator if credentialsProvider.authenticatorIdleTimeout.isDefined =>
            authenticator.copy(
              idleTimeout = credentialsProvider.authenticatorIdleTimeout,
              expirationDateTime = credentialsProvider.authenticatorExpiry.toDateTime
            )
          case authenticator => authenticator
        }.flatMap { authenticator =>
          silhouette.env.eventBus.publish(LoginEvent(user, request))
          silhouette.env.authenticatorService.init(authenticator).flatMap { token =>
            silhouette.env.authenticatorService.embed(token, Ok("Authentication successful"))
          }
        }
        case None => Future.failed(new IdentityNotFoundException("Couldn't find user"))
      }
    }.recover {
      case _: InvalidPasswordException => Unauthorized("Invalid credentials")
    }
  }
}

通过以上步骤,当用户凭据验证失败时,会记录相应的日志信息。你可以根据实际需求自定义日志的格式和存储方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

体验 Scala 语言的 Play Web 框架

我们将会学习如何创建一个 Play 项目,使用开发工具生成我们的第一个项目以及实现自定义的功能,另外还将体验一下 Play 框架的测试能力。...a Play Scala project name [play-scala-seed]: 我们给这个项目命名为 baeldung-play-framework.。...组织的名称将会作为项目中包的名称,Scala 的包名的命名规则 Java 的包名命名规则一样,因此我可以可以给包命名为 baeldung.com 现在,我们可以进入到 baeldung-play-framework...当 Play 项目服务器接收到请求,它首先会检查 conf/routes 文件,以确定哪个 Controller 控制器方法将处理该请求。...总结 在本文中,我们使用 Play Framework 的命令行工具创建了一个简单的网站,添加了一个新的视图模板,并使用参数化模板定义了一条新路由。

1.9K50

为什么要创建开放源码的PlayScala社区?

Play Framework从问世至今已经十个年头了,但是可惜的是这么优秀的框架在国内却鲜为人知。尤其是当Play Framework 2.x发布以后,基于Scala语言重写了整个框架。...当ScalaPlay Framework相遇,这本该是一段美好的佳话,可结局却是,面对Scala语言更多的人望而却步。 这其实都是因为人们潜意识里对未知事物充满恐惧。...例如很多人看到Scala使用::拼接元素,使用:::拼接列表,例如: val list1 = List("c", "a", "l", "a") val list2 = s :: list1 // list2...当然Scala的魅力远不止如此,当你慢慢了解它,你会慢慢深陷而无法自拔。...讲了那么多,我只想告诉你Scala并不可怕,其实在Play Framework中,你根本就不需要抱着Scala书籍啃完再写代码,PlayScala社区会为你准备一篇30分钟的为Play初学者准备的Scala

81150

解决问题method DESCRIBE failed: 401 Unauthorized

使用DESCRIBE方法,服务器可能要求提供有效的身份验证信息,以确保只有经过授权的用户才能访问相关的资源。解决方案为了解决401 Unauthorized错误,我们需要提供有效的身份验证凭据。...检查身份验证凭据首先,我们应该检查使用DESCRIBE方法所提供的身份验证凭据是否正确。确保用户密码等凭据与服务器进行身份验证所需的凭据一致。2....else: # 其他错误情况 print(f"请求失败,错误码:{response.status_code}")# 设置请求的URL、用户密码url = "https:/...参数传递用户密码,实现基本身份验证。...在RTSP协议中,DESCRIBE方法是与SETUP、PLAYPAUSE等方法配合使用的重要组成部分,用于建立控制流媒体会话。

1K10

Scala中构建Web API的4大框架

Play Framework ——JavaScala的高速Web框架        Play Framework是一个开源的Scala框架,于2007年首次发布。...它目前被一些相当大的名称网站使用,包括LinkedIn,三星的IoT Artik平台教育网站Coursera。在撰写本文Play 2.6是Play的当前版本,已在开发中取代了Play 1。...Play是开源的,它使采取者获得更高的安全性持续审查的代码库。 缺点 1. 社区中有许多很棒的插件,当然,但它们的稳定性实用性并不总能得到保证。 2. Play 2使用SBT构建系统。...它专为RESTful开发而设计,也是开发人员之前在Java Framework空间中使用DropwizardTwitter Commons的经验之谈。他们将Chaos设计为Play的简化版。...Chaos易于使用,特别是对于那些熟悉使用Scala用户来说。 2. 它所使用的所有库都经过了充分测试良好支持,提供了大量的文档知识库,可用于测试,迭代开发。 缺点 1.

2K40

Play-Utils:一个专门为 Play Framework 开发的实用工具包模块

Play-Utils 介绍 Play-Utils 是一个专门为 Play Framework 开发的实用工具包模块,目前已实现如下功能: Retry 自动请求重试 1 Retry Retry 工具包可以帮助你设置不同的重试策略...,自动重试失败的请求,最终返回成功的结果或者是最后一次重试结果。...你也可以使用 retryWhen 设置重试条件: import scala.concurrent.duration._ retry.withFixedDelay[Int](3, 1 seconds)...你可以通过 withExecutionContext  withScheduler 两个方法设置自定义的线程池定时器: import scala.concurrent.duration._ retry.withFixedDelay...1.2.2 JitterRetry JitterRetry包含两个参数minDelaymaxDelay,用于控制延迟时间的上限下限,真实的延迟时间会在这两个值之间波动: import scala.concurrent.duration

56620

Play For Scala 开发指南 - 第8章 用户界面

Twirl模板引擎介绍 Twirl 是 Play 内置的模板引擎,负责数据层展示与用户行为收集。Twirl 被设计成一个独立的模块,可以脱离 Play 环境单独使用。...大家可能觉得奇怪,没有了上下文,在模板中如何获取当前的请求呢?答案很简单:通过参数传递喽!利用Scala的隐式参数的特性,在调用模板函数不需要显示传入,编译器会自动传入。...._ import play.api.data.validation.Constraints._ 数据绑定 数据绑定是指将用户输入的表单数据绑定到 Form 对象的过程,例如下面定义一个用于接收用户登录邮箱密码的...scala.String 类型, 可以使用 minLength maxLength 参数限定长度。...当用户再次提交模板层渲染出的表单,表单参数传至服务器端,重新执行校验、绑定抽取等步骤,整个处理过程形成了一个闭环。 关于模板层 helper 的详细内容请参考官方文档。

1.4K20

进攻性横向移动

用户登录,系统通过将其与存储在安全数据库中的信息进行比较来验证用户的密码。当用户凭据通过身份验证,系统会生成访问令牌。代表此用户执行的每个进程都有此访问令牌的副本。...以另一种方式,它包含您的身份并说明您可以在系统上使用不能使用的内容。在不深入研究 Windows 身份验证的情况下,访问令牌引用登录会话,这是用户登录 Windows 创建的。...网络登录(类型 3):网络登录发生在帐户向远程系统/服务进行身份验证。在网络身份验证期间,可重用凭据不会发送到远程系统。...因此,当用户通过网络登录登录到远程系统用户凭据将不会出现在远程系统上以执行进一步的身份验证。...这只是我记录一些我不知道的事情并弄清楚事情是如何运作的。

2.1K10

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

Scaladoc 增强 改进的基于编译器的高亮显示 Scala 构建工具改进 Play Framework 更新 其他改进 版本控制系统 编辑器内代码审查 在 *Log*(日志)标签页中显示审查分支更改的选项...Play Framework 更新 为了解决旧版 Play Framework(2.8 及更低版本) JDK 17 之间的兼容性问题,我们引入了一条警告,在 Play 向导中通知您使用了不兼容版本的...Play JDK。...在工作表中,使用 Scala 2.13.12 ,编译错误会在构建窗口中再次正确报告,并且在第一次代码编译之前 import 不会再被错误地标记为未使用。...遇到预期值,补全弹出窗口会自动出现。 优化的 JSON 架构处理 Ultimate 我们优化了 JSON 架构验证补全背后的代码。 因此,IDE 现在可以更快处理这些任务并减少内存消耗。

1K20

新一代银行木马SharkBot正通过Play Store传播

SharkBot是一种银行木马,它能够绕过多因素身份验证机制窃取银行账户凭据,自2021年10月以来就一直处于活跃的状态。...研究人员观察到,该恶意软件主要针对意大利、英国和美国银行的手机用户。该木马可以劫持用户的移动设备并从网上银行和加密货币账户中窃取资金。...键盘记录:Sharkbot可以通过记录可访问性事件(与文本字段更改单击按钮相关)并将这些日志发送到命令控制服务器(C2)来窃取凭据。 短信拦截:Sharkbot 具有拦截/隐藏短信的能力。...而NCC小组专家也在第一间分享了针对这一威胁的妥协指标,包括上传到谷歌Play Store的已被下载数万次的受污染应用程序列表: Antivirus, Super Cleaner (com.abbondioendrizzi.antivirus.supercleaner...ATS不收集使用或扩展的凭证,而是使用凭据在端点本身上自动启动电汇,因此它无需登录,而且可以绕过2FA或其他反欺诈措施。”

70910

流行的9个Java框架介绍: 优点、缺点等等

Play框架可以为桌面移动接口构建轻量级的、web友好的JavaScala应用程序。...在底层,Play构建在Akka工具包之上,该工具包简化了在Java虚拟机上创建并发分布式应用程序。因此,Play使用了一个完全异步的模型,可以带来更好的可扩展性,特别是因为它还遵循无状态原则。...PrimeFaces是一个流行的web框架,用于为Java EEJavaServer Faces(见上面)应用程序创建轻量级用户界面。它被许多财富500强公司、政府机构教育机构使用。...例如,您可以使用Spring Boot运行应用程序。Flow还允许您在Kotlin或Scala中编写应用程序。...Wicket是一个基于组件的web应用程序框架,类似于JavaServer FacesTapestry。它允许您使用纯JavaHTML代码编写优雅、用户友好的应用程序。

3.4K20

【Web后端架构】2022年10个最佳Web开发后端框架

Web开发通常分为两类:前端开发后端开发。后端开发人员负责构建web应用程序的服务器端。 当前端部分与用户交互,后端部分负责内部工作。...它遵循MVC体系结构,并提供了一些有用的功能,如模型视图控制器、前端控制器、活动记录、数据映射配置约定。...它被认为是一个微框架,因为它省略了特定工具库的使用。此外,没有数据库抽象层、表单验证或外部源依赖。 它是一个简单、高度灵活、高性能的web框架。作为一个轻量级的框架或微框架,它很容易学习理解。...最佳Python后端框架 10.Scala开发人员的Play框架 PLAY是用ScalaJava编写的,是最强大的后端web框架之一。...如果你想学习Scala并开始使用Play Framework进行web开发,并且需要一个资源来开始在线学习,那么我建议你加入Scala&Functional Programming for初学者|在Udemy

3.9K20

Trino 372正式发布

(#11068) Druid连接器 在未启用元数据缓存并且使用带有用户凭据名称或密码凭据名称的额外凭据来访问数据修复虚假查询失败。...(#11122) MySQL连接器 在未启用元数据缓存并且使用带有用户凭据名称或密码凭据名称的额外凭据来访问数据修复虚假查询失败。...(#11068) Oracle连接器 在未启用元数据缓存并且使用带有用户凭据名称或密码凭据名称的额外凭据来访问数据修复虚假查询失败。...(#10059) 在未启用元数据缓存并且使用带有用户凭据名称或密码凭据名称的额外凭据来访问数据修复虚假查询失败。...新版本自动启用 TLS 证书验证。 更新 TLS 配置以保留旧行为。 (#10898) 在未启用元数据缓存并且使用带有用户凭据名称或密码凭据名称的额外凭据来访问数据修复虚假查询失败

1.6K30

来玩Play框架01 简介

Java程序员Guillaume Bort在JVM上创造了一个全新的框架Play frameworkPlay拥有ROR或Django那样的灵巧,又不失Java的稳定,更有JVM这一强大的运行平台。...创建与运行 切换到/home/vamei,创建一个网络应用test, play new test 跟随指示,输入项目的必要信息。应用名编程语言,分别为testJava。...routes记录了url请求和控制器的对应关系。当有http请求进入时,Play将根据该文件的设置,调用特定的控制器行动。 现在,切换到/home/vamei/test,并运行项目。...此时的Play不依赖于Shell,即使退出服务器的登陆,Play还是会持续运行。 使用其它端口运行: play "start -Dhttp.port=8080" 停止运行。...切换到项目的根目录下,使用命令: play stop 总结 play new play run 动态生成响应 model-control-view

1.4K70

来玩Play框架01 简介

Java程序员Guillaume Bort在JVM上创造了一个全新的框架Play frameworkPlay拥有ROR或Django那样的灵巧,又不失Java的稳定,更有JVM这一强大的运行平台。...创建与运行 切换到/home/vamei,创建一个网络应用test, play new test 跟随指示,输入项目的必要信息。应用名编程语言,分别为testJava。...routes记录了url请求和控制器的对应关系。当有http请求进入时,Play将根据该文件的设置,调用特定的控制器行动。 现在,切换到/home/vamei/test,并运行项目。...此时的Play不依赖于Shell,即使退出服务器的登陆,Play还是会持续运行。 使用其它端口运行: play "start -Dhttp.port=8080" 停止运行。...切换到项目的根目录下,使用命令: play stop 总结 play new play run 动态生成响应 model-control-view

98620

简洁、高效、灵活:探索 Spring 同级别的编程框架

Grails等框架的缺点: 更快的启动时间 降低内存占用 最少使用反射 最少使用代理 易于单元测试 不生成运行时字节码 这是通过在编译预先计算框架基础结构来实现的,这减少了应用程序工作所需的运行时逻辑...Play Framework Play Framework 是基于一个轻量级的、无状态的、Web 友好的架构。...Play 可以直接支持日常任务热重载来节省宝贵的开发时间。 Play 结合了生产力性能,可以轻松使用 Java Scala 构建可扩展的 Web 应用程序。...一个基于Groovy的强大的模板引擎,可实现多层继承,定制用户标签等功能。 优秀的错误报告功能:发生异常,该框架会直接显示出错误的源代码,甚至是模板代码。...它支持配置文件集中管理、应用程序监控、异常处理日志记录等功能,帮助开发者更好地维护管理应用程序。 这些框架在不同的场景需求下具有各自的优势特点,感兴趣的可以自行学习一下。

46850

Kafka Manager实现原理与填坑

, 每个Topic消息的读写速度等; 下面我们会先简单介绍下Kafka Manager的实现和在使用中遇到的几种坑; Kafka Manager实现 实现语言: Scala 用到的框架第三方库: Play...framework: Kafka-Mananger本质上是个Web应用, 因此使用play framework的MVC架构实现; AKKA: 用于构建高并发、分布式容错的应用....实现: 其实kafka manager的代码还是很清晰易阅读的, 如果熟悉scalaplay的话应该没有难度. 不同本人也是现学现用, 好惭愧~~~....Consumer offset的详情不完整 通过上面的源码分析我们知道km是通过消费"__consumer_offsets"来获取某一个组的消费情况的,消费这个topic,消费用户自己的topic没什么两样..., km里使用"props.put("auto.offset.reset", "latest")"默认offset无效从最新位置来拉取, 如果一个group用户已经有段时间没有提交offset(但还没有完全过期

3.5K20
领券