在单页 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 进行身份验证和授权 的相关文章

  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • Django 自定义 UserManager 中的 self.model()

    所以 我对 Django 还很陌生 尽管我的代码在遵循 Django 文档 在 Django 中自定义身份验证 之后工作 但我不明白他们的示例中的 self model 实际如何工作 它来自哪里以及它如何与 自己 这是在文档底部找到的示例
  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当
  • 如何使用 keycloak 强制每个客户端登录(最佳实践?)

    我们目前正在实施 keycloak 但我们面临着一个问题 我们不确定解决它的最佳方法是什么 我们有不同的网络应用程序使用单点登录 并且运行良好 我们遇到的问题是 当我们在一个 Web 应用程序中使用 sso 登录 然后在另一个 Web 应用
  • 在浏览器上验证 JWT

    我一直在读关于JWT https jwt io 我知道它分为三个部分 即header payload and signature 我将哈希算法保留在标头中 将基本信息保留在有效负载中例如 姓名 年龄 职务 有效期等在有效负载中 然后这两个都
  • 将 gsutil 与谷歌驱动器(不是谷歌云存储)一起使用

    gsutil https cloud google com storage docs gsutil csw 1 gettingstarted use 博托配置文件 https cloud google com storage docs gs
  • 401 Unauthorized("detail":"未提供身份验证凭据。")

    我在后端使用 djoser 的身份验证 当我通过具有内容类型和授权标头的邮递员在 account me 发出获取请求时 我得到了正确的响应 但是当我尝试从我的角度客户端执行相同的请求时 我得到401 Unauthorized detail
  • 在抛出异常之前重试某件事 3 次 - 在 clojure 中

    我不知道如何在Clojure中实现这段Python代码 for i in range 3 try except e if i 2 raise e else continue else break 我想知道为什么在 Python 中如此简单的
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 客户端登录 - 如何在客户端安全地存储凭据?

    许多 API 都提供通过用户 密码组合远程访问其数据的功能 我想知道存储这些值的最佳方式是什么 高度安全的方式 即使 100 是不可能的 以便直接连接它们而无需每次都询问这些值 我推荐以下三种方法之一 使用身份验证令牌完全避免存储密码 在此
  • 如何在之前的 Facebook 身份验证后自动安全地让用户登录?

    用户抱怨他们必须过于频繁地登录 如果身份验证完全基于 Facebook OAuth 那么用户如何在下次访问该页面时自动登录 用户流程示例 用户点击 使用 Facebook 登录 用户通过 Facebook 进行身份验证并被重定向回网站 用户
  • 在 Rails 3 中选择性地关闭 Devise 的 Flash 通知

    Devise 身份验证框架在各处都使用 Flash 通知 这使得与应用程序集成变得很容易 但有时会导致用户体验不佳 我想知道有什么简单的方法可以有选择地关闭 Rails 3 应用程序中的一些 Devise flash 通知 特别是 我想摆脱
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 存储外部站点(不使用 OAuth)的用户凭据的智能方法是什么?

    我意识到 一般来说 您不应该直接存储用户凭据 即以纯文本形式 相反 最好存储它们的某种加密形式 但是 假设我创建了一个与其他第三方网站交互的网站 假设这个第 3 方站点提供了一个 API 需要用户的凭据 使用该站点 进行身份验证 如果我的目
  • “WSGIRequest”对象没有属性“successful_authenticator”

    我已经创建了一个像这样的身份验证类 RESTful API 的令牌身份验证 是否应该定期更改令牌 https stackoverflow com questions 14567586 token authentication for res
  • HTTPS URL 的基本代理身份验证返回 HTTP/1.0 407 需要代理身份验证

    我想在 Java 中使用具有基本身份验证 用户名 密码 的代理来进行连接 并且仅此连接 以下代码适用于 HTTP URL 例如 http www google com http www google com URL url new URL
  • php 中的简单授权/登录功能

    我希望第一次实现用户登录到我的网站 我很高兴构建自己的解决方案 或者实现一些开源的东西 但是到目前为止 在我的搜索中没有任何包是明显的选择 同样 我完全意识到 作为一名中级 php 程序员 如果我推出自己的解决方案 并真正敞开大门 我很可能
  • python:API 令牌生成及其危险

    我正在按照 Flask Web Development 一书来实现基于令牌的身份验证 基本上 用户使用 HTTP 基本身份验证对其进行身份验证 并为其生成令牌 s Serializer app config SECRET KEY expir
  • 自托管 WCF REST 服务和基本身份验证

    我创建了一个自托管的 WCF REST 服务 带有 WCF REST Starter Kit Preview 2 中的一些额外内容 这一切工作正常 我现在正在尝试向服务添加基本身份验证 但我在 WCF 堆栈中遇到了一些相当大的障碍 这阻止了
  • Cakedc.users => 总是重定向到主页

    我在新的 Cakephp 安装上使用插件 CakeDC Users 我有两个控制器 PagesController php CardsController php Pages 有 1 个操作 Beta 它是主页 Cards 有两个操作 索引

随机推荐

  • 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 应用程序验证用户名和密码 并获取经过身份验证的用户记