Spray中的Authentication和JMeter测试

Spray Authentication

在Spray中,如果需要对REST API添加认证,可以使用Spray提供的Authenticate功能。本质上,Authenticate属于安全指令(Security Directive)提供的功能。它的接口定义本质上为:

def authenticate[T](auth: => Future[Authentication[T]])(implicit executor: ExecutionContext): Directive1[T]

def authenticate[T](auth: ContextAuthenticator[T])(implicit executor: ExecutionContext): Directive1[T]

Spray使用了Magnet Pattern,使其可以编写出更符合DSL风格的API。所以我们看到的authenticate()方法的实现实际为:

trait SecurityDirectives extends scala.AnyRef {
  def authenticate[T](magnet : spray.routing.directives.AuthMagnet[T]) : spray.routing.Directive1[T] = ???
}

正是因为运用了Magnet Pattern,我们可以直接在Path中通过authenticate添加认证功能,例如:

def myUserPassAuthenticator(userPass: Option[UserPass]): Future[Option[String]] =
    Future {
      if (userPass.exists(up => up.user == "John" && up.pass == "p4ssw0rd")) Some("John")
      else None
    }
  val customerRoute =
    path("customers") {
      authenticate(BasicAuth(myUserPassAuthenticator _, realm = "admin area")) {  user =>
        get {
          handleRequest {
            AllCustomers
          }
        } ~ post {
          entity(as[Customer]) {
            customer =>
              handleRequest {
                CreateCustomer(customer.email, customer.name)
              }
          }
        }
      }
    }

Spray Authentication通过BasicHttpAuthenticator类来支持Basic Access Authentication。上面代码片段中的BasicAuth是一个对象,提供了多个构造函数重载。这段代码中传递了两个参数:第一个参数为UserPassAuthenticator类型;第二个参数用于指定认证的realm。

UserPassAuthenticator是一个type,实质为一个函数:

type UserPassAuthenticator[T] = Option[UserPass] => Future[Option[T]]

上面代码中的myUserPassAuthenticator就是自定义的一个UserPassAuthenticator。显然,BasicAuth接收一个函数作为参数,使得我们可以更容易自定义。若要通过认证,我们可以创建BasicHttpCredentials对象,将其加入到authorization header中。Spray也支持配置的形式管理用户信息,具体内容可参见Spray的官方文档Authentication。

JMeter测试

我用JMeter来测试这个具有Authentication的REST API。由于具有认证功能,因而,在JMeter中需要添加Http Authorization Manager。Http Authorization Manager是Config Element,添加后,需要配置认证信息,包括Base URL、Username、Password、Realm等。如下图所示:

注意,在配置Base URL时,应该设置为完整的URL(当然,也可以使用JMeter的变量)。

如果为了验证执行是否成功,建议添加View Result Tree这个Listener,因为它给出的结果信息中包括了Sampler result、Request与Response Data等信息,这样有利于我们甄别测试的Http Request是否正确,如果错误,是什么原因导致的。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2015-02-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jeremy的技术点滴

《Network Programming with Go》阅读重点备忘(二)

3175
来自专栏JackieZheng

Spring实战——XML和JavaConfig的混合配置

前言 看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨。所以现在每次写完主要内容后,还需要对于格式稍稍调整下。那么有没...

1806
来自专栏xingoo, 一个梦想做发明家的程序员

TDDL与Spring Boot集成Version报错——跟踪与解决

先说背景:公司采用diamond+tddl,这套技术来做web管理。本人处于好奇率先体验了下spring-boot,于是就有了spring-boot+tddl...

1859
来自专栏编程思想之路

WiFiAp探究实录--功能实现与源码分析

Android虐我千百遍,我待Android如初恋。 ——————编辑于2017-08-02——————— wifi热点说的是wifiAp相...

6228
来自专栏程序员的SOD蜜

常见.NET功能代码汇总

1,在Web上修改指定文件位置的Web.config 这里需要使用 WebConfigurationManager 类,但必须使用WebConfiguratio...

3429
来自专栏hbbliyong

C#读取“我的文档”等特殊系统路径及环境变量

返回“我的文档”路径字符串 Environment.GetFolderPath(Environment.SpecialFolder.Personal) ? 本技...

3288
来自专栏后端之路

RMI鉴权

关于使用spring自动扫描发布rmi详细请阅读把大象放进冰箱–spring自动扫描并发布rmi 下面详细描述一下rmi鉴权相关内容 背景 由于大量业务查询需要...

1738
来自专栏c#开发者

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,member...

2687
来自专栏james大数据架构

使用VS2010 C#开发ActiveX控件

  在网上查了一些资料也实际操作了一下,在此自己再作一次详细记录。   功能:将对机具操作的FK.dll封装成fk.ocx,注册后能在网页上对机器操作。 使用V...

2187
来自专栏学习力

《Java从入门到放弃》框架入门篇:使用注解的方式配置hibernate映射关系

1337

扫描关注云+社区