在单页 Clojure Web 应用程序中使用 Friend 进行身份验证和授权

2023-12-31

我正在尝试将好友身份验证和授权集成到 Clojure/Compojure 单页 Web 应用程序中。

我有一个由 Angular 控制器支持的登录表单,该控制器使用 AJAX 针对 Web 应用程序验证用户名和密码,并获取经过身份验证的用户记录。因此,我不希望基于朋友表单的登录提供默认行为 - 我基本上想依赖 HTTP 状态代码,而且我确实这样做not想要任何朋友页面重定向。

例如,发出未经身份验证的请求应仅返回 401 状态代码,而不应重定向到“/login”。我通过在配置 Friend 时指定自定义“:unauthenticated-handler”来使这部分工作(代码如下)。

成功登录后,我只需要 200 状态代码,而不是重定向到最初请求的页面。这是我无法工作的。

我根据各种示例编写了一个自定义好友身份验证工作流程(我的 Clojure 技能现在处于初学者水平):

(defn my-auth
  [& {:keys [credential-fn]}]
    (routes
      (GET "/logout" req
        (friend/logout* {:status 200}))
      (POST "/login" {{:keys [username password]} :params}
        (if-let [user-record (-> username credential-fn)]
          (if
            (and
              [user-record password]
              (creds/bcrypt-verify password (:password user-record)))
            (let [user-record (dissoc user-record :password)]
              (workflows/make-auth user-record {:cemerick.friend/workflow :my-auth :cemerick.friend/redirect-on-auth? true}))
            {:status 401})
          {:status 401}))))

这是我声明的中间件的处理程序:

(def app
  (-> 
    (handler/site
      (friend/authenticate app-routes
        {:credential-fn (partial creds/bcrypt-credential-fn my-credential-fn)
         :unauthenticated-handler unauthenticated
         :workflows [(my-auth :credential-fn my-credential-fn)]}))
    (session/wrap-session)
    (params/wrap-keyword-params)
    (json/wrap-json-body)
    (json/wrap-json-response {:pretty true})))

以及上面引用的附加处理函数:

(defn unauthenticated [v]
  {:status 401 :body "Unauthenticated"})

最后一个额外的路由片段来测试身份验证:

(GET "/auth" req
  (friend/authenticated (str "You have successfully authenticated as "
    (friend/current-authentication))))

This mostly作品,以及almost做我需要的一切。

因为“身份验证重定向?”在“make-auth”中为 true,成功登录后会生成页面重定向 - 我想阻止该重定向,因此我将该值设置为 false。但是,此单一更改会导致 404 错误和登录失败。

因此,除了好友身份验证映射外,我还需要以某种方式在此处返回 200 状态代码,并且我还想在响应正文中返回“用户记录”,以便客户端应用程序可以根据用户角色定制 UI(我已经封装了 JSON 请求/响应并正在运行)。

所以我认为当我调用 Friend“make-auth”函数时我需要与此等效的功能:

{:status 200 :body user-record}

然而,似乎我可以拥有身份验证映射或响应 - 但不能同时拥有两者。

这可以通过 Friend 实现吗?如果可以的话,如何实现?


你需要有:redirect-on-auth? as false并且您需要将您的响应包装在响应图中{:status 200 :body (workflows/make-auth...)}。请注意,您可能需要将您的身体序列化为String或者其他可以处理的事情。

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

在单页 Clojure Web 应用程序中使用 Friend 进行身份验证和授权 的相关文章

  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 为什么这个 Clojure 程序在可变数组上运行如此慢?

    剧透警告 这是 代码降临 第六天的第一部分 我试图解决this http adventofcode com day 6Clojure 和 Scala 中的问题 Scala 程序在我的 Macbook Air 上运行良好 几秒钟内就完成了 然
  • Rails:RSpec - nil:NilClass 的未定义方法“cookie_jar”

    铁轨新手 尝试遵循迈克尔 哈特尔的教程 尝试添加辅助方法来模拟 RSpec 测试中的日志时陷入困境 describe when the a user has logged in and attempts to visit the page
  • 使用 swank-clojure 攻击 Clojure 库的工作流程

    Clojure 库的黑客攻击有典型的工作流程吗 假设我的应用程序 Foo 依赖于第三方库 Bar 该库是从存储库获取的 并通过以下方式包含在项目 Foo 中lein deps 然后 假设我想破解 Bar 库 所以我从 github 克隆它
  • 如何在 Express.js 中设置身份验证中间件

    我已经设置了一个网络应用程序 其中一些内部页面需要登录 我使用 Node 和 Express js 来设置服务器并控制路由和身份验证工作正常 我在 a 中提出了 zanko 建议与同一应用程序相关的问题 https stackoverflo
  • clojure - 不同命名空间中的评估代码

    我正在编写类似 REPL Server 的代码 用户的请求在这样的函数中评估 defn execute request str try eval read string request catch Exception e getLocali
  • 用户注册错误:没有这样的表:auth_user

    我正在尝试使用 Django 的默认身份验证来处理注册和登录 setting py INSTALLED APPS django contrib admin django contrib auth django contrib content
  • 新站点预计支持哪些知名 OpenID 提供商?

    我计划开发一个支持 OpenID Connect 作为依赖方的 Web 应用程序 以便该应用程序的用户可以使用他选择的身份提供商进行注册和登录 这与每个 Stack Exchange 站点上的 我的登录 使用的技术相同 该应用程序可供服务器
  • Ember 数据保存方法,创建与更新

    我不明白 Ember 如何确定是否应该更新或创建记录 我认为它是基于 ID 或商店条目 但它似乎是其他东西 代码示例阐明了 this returns the user without making an api call currentUs
  • Rails 身份验证插件推荐

    我想向我的 Rails 应用程序添加身份验证 我遇到了几个这样做的插件 acts as authenticated restful authentication Authlogic 等 我还没有看到一篇文章描述使用每种方法的差异 优点和缺点
  • 请确保至少一个领域可以验证这些令牌

    所以我把我的shiro设置为有两个Realms 用户名和密码领域 使用标准 UsernamePasswordToken 我还设置了一个自定义承载身份验证令牌 用于处理从用户传入的令牌 如果我只使用我的passwordValidatorRea
  • C# SMTP 身份验证失败,但凭据正确

    这是我的问题 我编写了以下程序来测试是否可以发送电子邮件 class Program static void Main string args try Console WriteLine Mail To MailAddress to new
  • 确定用于映射网络驱动器的域和用户名

    使用带有 SP1 的 Windows 7 Enterprise 但我希望得到适用于 Windows XP 2003 2008 Vista 7 的通用答案 从命令提示符处 我执行net use命令将 Z 驱动器映射到另一台计算机上的共享 但我
  • Firebase GAS webapp Google 弹出窗口消失

    我正在尝试升级我的 firebase GAS web 应用程序 之前我有一个弹出窗口 可以让用户使用 Google 登录 我不确定我做错了什么 但我已经升级到新的 firebase 现在正在尝试使用新的代码格式进行相同的登录 发生的情况是
  • 在 React Native 应用程序中哪里可以获取 EXPO DEBUG 值?

    当我尝试登录 expo 时出现此错误 exp Set EXPO DEBUG true in your env to view the stack trace 你知道我到底要在哪里设置值吗EXPO DEBUG EXPO DEBUG是一个环境变
  • Twitter 登录说明

    我想在 Android 中创建一个 Twitter 应用程序 为此 我想创建一个登录页面并登录到 Twitter 为此 我们需要消费者密钥和消费者密钥 这是什么意思 要创建此登录页面 除了 Twitter 帐户之外 我们还需要其他任何东西吗
  • 如何在 REPL 中显示 Clojure 中函数的定义?

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr

随机推荐

  • LoadLibraryEx 忽略并排清单

    Does LoadLibraryEx函数使用并排清单 我有带有嵌入式 SxS 清单的 bar dll 该清单描述了该 bar dll 的版本 其他 dll 文件 foo dll 具有将 bar dll 列为依赖项的清单 并具有指定的版本 但
  • 重命名 zip 文件内的文件名

    尝试重命名 zip 文件中的内部文件 而不必以编程方式解压缩然后重新压缩 例子 test zip包含test txt 我想更改它 以便test zip将包含newtest txt test txt重命名为newtest txt 内容保持不变
  • 编译器 PDB 文件和链接器 PDB 文件

    我对编译器和链接器之间的区别感到困惑PDB分别文件 即在 Visual Studio 中 Project Properties gt C C gt Output Files gt Program Database File Name vs
  • NSAlert 没有弹跳停靠图标

    如果你提出一个NSAlert当您的应用程序在后台运行时 您的停靠栏图标开始弹跳并持续弹跳 直到您切换回来 我觉得这很烦人 有谁知道如何禁用单个应用程序 创建您自己的 NSApplication 子类 并实现如下所示 int requestU
  • 基于选择动态改变编码中的 Y 轴字段 Vega-Lite

    如何根据选择动态更改为 y 轴编码的数据字段 我正在尝试构建一个可视化来显示一天 24 小时内的事件计数数据 并且我希望用户能够选择不同的时区 例如 EST CST MST 或 PST 为此 我构建了一个单一选择 在其中指定上面括号中列出的
  • ON 子句中另一个未知列名错误

    Query SELECT c title AS title c introtext AS body c state AS state c created AS created c created by AS uid c modified A
  • 在 Google Colab 中使用笔记本电脑网络摄像头进行实时 YOLO 对象检测

    我正在使用网络摄像头在本地系统上使用 YOLOv3 和 OpenCV 进行实时对象检测 一切都像魅力一样运作链接在这里 https github com pdhruv93 YOLO Object Detection blob master
  • CS231n:如何计算Softmax损失函数的梯度?

    我正在观看斯坦福 CS231 用于视觉识别的卷积神经网络的一些视频 但不太明白如何使用计算 softmax 损失函数的解析梯度numpy From 这个堆栈交换 https math stackexchange com questions
  • Video.js 具有空源

    无论如何 我可以放置 video js 而无需在视频标签上设置源吗 Video js 启动时没有源而失败 我想放置没有源的 video js 并从 js api 层设置源 同样的问题 但没有人回答 VideoJS 没有源码吗 https s
  • Angular PWA 不会在生产环境中更新

    我在 Angular 8 中有一个 PWA 我添加了 ng add angular pwa 并且 PWA 功能似乎可以工作 接受这个问题 当我将新版本推送到生产时 该应用程序是not在人们的浏览器上进行了更新 在 Chrome 和移动 Sa
  • 交易延长时段

    什么是 扩展会话反模式 延长 或长 会话 或每个会话的会话数 是一个可能在事务持续时间之外存在的会话 与事务范围内的会话相反 或每个请求的会话数 这不一定是反模式 这是一种实现方式长时间的谈话 即与数据库的对话跨越多个事务 这只是anoth
  • 目前进行并行下载最舒适、最可靠的跨平台 Perl 模块是什么?

    我将不得不通过简单地在 URL 上发布并获取 XML 作为回报来下载许多数据集 我可以通过一次执行多个请求来加快这一速度 但问题是 它需要在 Windows 和 Linux 上运行 所以线程和叉子都出局了 因为这纯粹是 IO 绑定的 所以我
  • 如何在 BroadcastReceiver 中添加 Snackbars?

    快捷栏通过在屏幕底部显示简短消息来提供有关操作的轻量级反馈 快捷栏可以包含一个操作 Android 还提供了一个 toast 主要用于系统消息传递 Toast 与 Snackbar 类似 但不包含操作 也不能滑出屏幕 我的问题 import
  • “auto it = unordered_map.find(key)”的推导类型?

    随着 C 11 的出现 我们有 unordered map cbegin cend 来专门返回 const iterator 的值 所以表达式 auto it unordered map cbegin 中 it 的推导类型是const it
  • 宏执行 fgets 剥离换行符

    给出以下两个要使用的语句fgets并去掉换行符 puts Enter the name fgets temp name 40 stdin temp name strcspn temp name n 0 下面的宏足以代替这个吗 define
  • 在mysql中计算5分钟间隔的平均值

    我有一张桌子log有柱子id myValue myCategory and myTimestamp 假设表是这样填充的 ID MYVALUE MYCATEGORY MYTIMESTAMP 1 10 1 2010 11 1 10 00 00
  • 如何获取所有终端节点 - r 中的权重和响应预测“ctree”

    这是我可以用来列出所有终端节点的权重的方法 但是如何添加一些代码来获取响应预测以及每个终端节点 ID 的权重 说我希望我的输出看起来像这样 以下是我迄今为止获得的重量 nodes airct unique where airct 谢谢 二叉
  • PHP 缓存 - 保存在数据库中还是创建文件更快?

    我目前正在缓存动态生成的 PHP 页面 方法是将它们保存到带有到期时间字段的数据库中 如果再次请求该页面 程序会检查是否有未过期的缓存版本的页面可供使用 并且仅在找不到页面时才重新生成该页面 这很有效 但是将缓存的页面保存为文件而不是保存到
  • ng test --code-coverage 不打印覆盖率详细信息

    当我使用运行测试时ng test code coverage我得到的代码覆盖率为未知 不确定可能出了什么问题 感谢这里的任何帮助 gt ng test code coverage 10 building modules 1 1 module
  • 在单页 Clojure Web 应用程序中使用 Friend 进行身份验证和授权

    我正在尝试将好友身份验证和授权集成到 Clojure Compojure 单页 Web 应用程序中 我有一个由 Angular 控制器支持的登录表单 该控制器使用 AJAX 针对 Web 应用程序验证用户名和密码 并获取经过身份验证的用户记