在playframework中拦截请求并检查授权

2024-02-12

我在用着play framework 2.4.2使用Java,我想通过拦截所有请求并检查是否设置了会话值来验证用户是否已登录。所以我延长了默认HttpRequestHandler https://www.playframework.com/documentation/2.4.2/api/java/play/http/DefaultHttpRequestHandler.html并覆盖createAction拦截所有请求的方法。但是,我还没有找到验证会话的好方法。

选项 1 - 失败

当我尝试获取会话值时,出现运行时异常:There is no HTTP Context available from here

以下是我正在使用的课程:

public class RequestHandler extends DefaultHttpRequestHandler {
    @Override
    public Action createAction(Http.Request request, Method method) {
        session("loggedIn"); // Throws runtime Exception: no HTTP Context
    }
}

选项 2 - 丑陋

由于会话在技术上是一个 cookie,我可以使用如下代码从标头检索值:

for(String cookie : request.headers().get("Cookie")){
    System.out.println("cookie: "+cookie);
}

但随后我必须解析类似于以下行的 cookie 字符串才能获取loggedIn 值。对我来说太脏了。

_ga=GA1.1.1508004144.1421266376; ki_r=; ki_t=1438789543788%378129908%3B1438789543788%3B1%3B1; PLAY_SESSION=0570411c3eb55ad230681539ddcfaa4220583fd-loggedIn=1

选项 3 - 太容易忘记注释

我注意到一些网站记录了不同的方法,而是创建了一个
动作组合 https://www.playframework.com/documentation/2.4.2/JavaActionsComposition并向每个控制器类或方法添加适当的注释。

这种方法的问题是它要求开发人员记住添加注释。我更愿意将其反转以默认阻止每个路由,然后向不需要验证的路由添加注释。

几个记录动作组合的网站:

  1. http://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/ http://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/
  2. https://www.playframework.com/documentation/2.2.1/JavaGuide4 https://www.playframework.com/documentation/2.2.1/JavaGuide4

Question

有没有办法全局验证用户是否应该有权访问页面以及如何获取会话变量?

*请注意,我对使用第三方插件进行身份验证不感兴趣。


即使我会重新考虑使用动作组合,您也可以修复选项 1。

创建自定义注释来标记不需要验证的操作。

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface NoAuthRequired {}

然后更改您的 HttpRequestHandler 实现。

public class RequestHandler extends DefaultHttpRequestHandler {
    @Override
    public Action createAction(Http.Request request, Method actionMethod) {
        return new Action.Simple() {
            @Override
            public F.Promise<Result> call(Http.Context ctx) throws Throwable {
                // if the action is annotated with @NoAuthRequired or user is logged in delegate to it
                if (actionMethod.isAnnotationPresent(NoAuthRequired.class) || ctx.session().containsKey("loggedIn")) {
                    return delegate.call(ctx);
                }
                // otherwise, block access
                else {
                    return F.Promise.pure(forbidden("You're not allowed"));
                }
            }
        };
    }
}

这样,除非明确注释,否则每个路由都需要验证。

从代码中可以看到,会话是通过Context获得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在playframework中拦截请求并检查授权 的相关文章

  • SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

    我正在尝试将输入和输出缓冲区从 C 传递给 java 类 出于效率原因 我需要使用 ByteBuffer 这两个缓冲区都是在 C 部分中分配的 我需要将它们传递给一个 java 函数 该函数将使用输入缓冲区进行一些计算并将结果写入输出缓冲区
  • 使用 Java-Large 文件查询 JSON 文件

    我正在尝试使用 java 解析下面的 JSON 文件 我需要能够 按 ID 或名称或对象中的任何字段搜索文件 也在字段中搜索空值 搜索应返回整个对象 该文件将会很大 并且搜索应该仍然很省时 id 1 name Mark Robb last
  • Java简单加密

    我想加密存储在磁盘上的文本 配置 文件 尝试使用DES http en wikipedia org wiki Data Encryption Standard加密 我在客户端计算机上遇到了致命错误 后来我发现该算法无法处理重音字符 我怀疑这
  • TestNG 启动期间发生内部错误

    我创建了一个 TestNG 类 FirstTest java 当我将测试用例作为 TestNG Test 运行时 出现以下错误 期间发生内部错误 启动 FirstTest java lang NullPointerException Ecl
  • Criteria eager fetch-joined 集合以避免 n+1 选择

    假设 Item 和 Bid 是实体 一个 Item 有多个 Bid 它们被映射到休眠在典型的父子关系中
  • Java - 了解 PrintWriter 和刷新的需要

    好吧 首先我对所有代码表示歉意 但我觉得代码太多总比代码不够好 我正在制作一个简单的聊天客户端和印刷机 尤其是我正在努力解决的问题 使用现在的代码 它将与服务器类交互 并且完美地打印我想要打印的内容 但是 当我删除 writer flush
  • 使用 Thymeleaf 时我们应该删除 HTML 属性吗?

    我正在研究 Thymeleaf 发现几乎所有示例中都有 Thymeleaf 的标签值以及标准 HTML 值 例如 这些
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • Android Studio 找不到 com.android.support:support-v4:19.1.0

    我已将一个项目导入Android Studio但我收到错误 找不到 com android support support v4 19 1 0 我在哪里可以找到这个文件 我已经使用导入了项目Gradle 我有Android Studio v
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • Android Google 地图:隐藏整个地图的多边形或形状

    我试图隐藏除一个区域之外的整个地图 因为我使用的多边形在我想要显示的区域中有一个洞 问题在于 根据缩放的不同 空白区域会被多边形的颜色覆盖 或者多边形会失去其颜色 这是代码 polygon hide all world map float
  • 如何在开头时解析 json 文件

    我想解析以下 JSON 文件 但以 向我表明这是一个数组 然后继续 对象 我当前的解析器返回一个 JSON 对象 我的问题是 如何修改解析器来解析这个文件 这样解析器将为我提供其他 JSON 文件 从对象或排列开始 JSON 文件 codi
  • Android 以编程方式停止 toast 通知?

    有没有办法以编程方式停止 Toast 消息 假设我有一个按钮 单击它可以滚动 toast 消息 并且在 onclick 事件中我想停止队列中的所有消息并只显示新消息 我该怎么做 我的代码的简化版本如下 代码 public class Hel
  • System.out.println("嗨"+6+10);打印Hi610?

    为什么要这样做 太令人困惑了 运算符优先级和结合性 两点 操作员 如果一个或两个参数都是字符串 则进行字符串连接 操作员 从左到右工作 所以在你的例子中 Hi 6 is Hi6 and Hi6 10 is Hi610 编辑 正如您在对另一个
  • 为什么我的 Java 路径中添加了“L”?

    我在我的类路径中加载了一个 jar 在 iReport 中 如果重要的话 我确信它具有所需的方法 但是当我尝试测试连接 从而调用该 jar 时 我得到一个 java lang NoSuchMethodError 说它正在引用班上 Lorg
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • 丰富:数据表行跨度问题

    我需要创建一个 rich dataTable 甚至扩展 具有以下功能 我有一个公司类 其中包含产品对象的集合 我想展示下表 我仍然没有弄清楚如何使用子表执行此操作 在所有示例中 我发现子表具有与主表完全相同的列 据推测 我需要在前两列中使用
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System

随机推荐

  • python中的3D图像旋转

    我有以下图像 I1 我没有捕捉到它 我从谷歌下载的 我将已知的单应性 h 应用到 I1 以获得以下图像 I2 我想假设相机拍摄了上面这张 I2 的照片 我找到了这个 相机 的相机矩阵 令这个相机矩阵为k 现在 我想围绕相机轴旋转该图像 I2
  • 以编程方式拦截我的应用程序中包含的 Android 3rd 方库发起的流量

    我正在尝试编写一些代码来拦截来自 到我的 Android 应用程序的任何网络流量 包括来自非 root 设备上的第 3 方库的流量 有办法做到吗 None
  • 淡出任何接近 UIScollView 边缘的内容

    正如标题所示 当一些 UIImageView 越来越接近 UIScrollView 的四个边缘中的任何一个时 我试图为它们提供淡出效果 由于用户可以拖动 UIImages 如果他将它们拖向边缘 它们就会开始淡出 而不是像 UIScrollV
  • Git 分支未显示所有分支

    我是 Git 的新手 我从 GitHub 克隆了一个分支 当我输入时会显示所有分支git branch 完成工作后 我成功地将其推送到新分支 之后 我将该文件夹复制到另一个目录 因为我想要备份以避免冲突 进入它 然后输入git branch
  • 如何有条件地从两个表之一中选择字段?

    我有两个表发票和待付款 它们都有以下共同行 发票 ID 和余额 我想在 MySQL 中进行选择 这样可以工作 伪代码 if invoice id exists in pending payments table select balance
  • 将扫描的 PDF 转换为可搜索的 PDF(在 R 中)

    我正在尝试使用以下命令将一系列扫描的 PDF 转换为可搜索的 PDFtesseract and pdftools包 我已经完成了两个步骤 现在我需要写回一个可搜索的pdf 阅读扫描版 PDF Run OCR 写回可搜索的 PDF eg lt
  • 如何在纯 Javascript 中的单选按钮上使用 addEventListener?

    如何在 html 中的单选按钮上附加事件侦听器 考虑这种形式
  • 如何使用 NDK 编译适用于 Android 的现有 C 程序?

    我正在编写一个 Android 应用程序来测试网络性能 并且我想在该应用程序中使用 iPerf 我可以找到已经为 Android 编译的二进制 iPerf 文件 然后我可以在手机上运行 iPerf 并收集其输出 但我对自己编译这些文件感兴趣
  • 如何在 Qt 中简单地序列化复杂结构并通过网络发送它们

    我正在创建一个客户端服务器应用程序 现在我正在处理一种最简单的方法来序列化一些类 将其传递到另一端 然后放回到我以后可以使用的类中 我意识到这并不简单 有些人可能会说在 C 或 C 等低级语言中不可能 但实际上通过大量编码是可以实现的 我想
  • 如何使用 Apache Cordova 3.4.0 在本地存储文件

    我在使用 apache cordova 的 文件 插件在 iOS 或 Android 设备上本地存储文件时遇到问题 我认为问题在于正确设置路径 这是我从 Xcode 收到的错误消息无法创建保存下载文件的路径 操作无法完成 可可错误 512
  • Conemu 和 console2 模拟器没有获取新的路径变量

    我想也许这是一个系统问题 但最近做了一个全新的安装 win7 64位 和一个干净的conemu安装 在旧的win32系统上conemu和console2都有同样的问题 此外 我发现研究的所有内容都与通过命令行添加变量有关 我通过 开始 gt
  • Bootstrap 3.0 媒体查询

    我正在开发一个基于 Bootstrap 3 html5 样板自定义构建 的小项目 并尝试使用 官方 媒体查询在引导文档中 http getbootstrap com css grid media queries Extra small de
  • 将 sklearn TfidfVectorizer 与已标记化的输入一起使用?

    我有一个标记化句子列表 想要安装 tfidf 矢量器 我尝试了以下方法 tokenized list of sentences this is one this is another def identity tokenizer text
  • 为什么这个 javascript 和 html 代码没有计算结果?

    这是代码
  • 如何使用c#从后台代码中查找SQL Server实例名称和服务器名称? [复制]

    这个问题在这里已经有答案了 可能的重复 SqlDataSourceEnumerator Instance GetDataSources 找不到本地 SQL Server 2008 实例 https stackoverflow com que
  • 基于 HTTPS 的 SOAP 客户端,双方均带有 SSL 证书

    我必须开发一个 SOAP 客户端 供应商向我发送了以下规格 将通过IP使用HTTPS进行传输 并打包为XML文档 以适应不同的XML方案定义 通讯是同步的 第三方需要等待响应 每个请求和响应都将被签名 我正在使用 PHP 中的soapCli
  • 如何启动 IPython 运行脚本?

    我的用例是我想初始化文件中的一些函数 然后使用定义的这些函数启动 IPython 有没有办法做这样的事情 ipython run script myscript py 在最新版本的 IPython 中 您确实需要添加 i之后可以选择进入交互
  • 通过 ssh 远程获取脚本

    我想通过ssh运行一个远程程序 这需要一定的环境 因此 在执行程序之前 我获取了构建环境的特定文件 如果我直接登录到机器上 这没有问题 但是当我通过 ssh 执行命令时 bin bash foo ssh user host source s
  • scala 中的惰性函数定义

    我一直在学习 Scala 我不得不说这是一门非常酷的语言 我特别喜欢它的模式匹配功能和函数文字 但我有 javascript ruby 背景 这些语言中我最喜欢的模式之一是惰性函数和方法定义模式 JavaScript 中的一个例子是 var
  • 在playframework中拦截请求并检查授权

    我在用着play framework 2 4 2使用Java 我想通过拦截所有请求并检查是否设置了会话值来验证用户是否已登录 所以我延长了默认HttpRequestHandler https www playframework com do