Rails 带有自定义 JSON 失败消息的基本身份验证
Rails basic authentication with cutomized JSON failure message
我有一个 Rails 5.2 应用程序处于 API 模式。如果请求提供了正确的基本身份验证凭据,将呈现预期的 JSON 数据 { status: true, data: 'test_user_data' }
。
users_controller.rb
class Api::UsersController < ApplicationController
before_action :basic_authenticate
def get_user_info
render json: { status: true, data: 'test_user_data' }
end
private
def basic_authenticate
authenticate_or_request_with_http_basic do |username, password|
username == 'test_name' && password == 'test_password'
end
end
end
application_controller.rb
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Basic::ControllerMethods
end
但是,如果基本身份验证失败,则只会呈现纯文本 HTTP Basic: Access denied.
。
我想做的是在身份验证失败的情况下在 JSON 中呈现错误消息,例如 { status: false, message: 'basic authentication failed'}
.
修复它的正确方法是什么?
在你的 application_controller.rb
中使用救援,如下所示
rescue_from User::NotAuthorized, with: :deny_access # self defined exception
def deny_access
render json: { status: false, message: 'basic authentication failed'}
end
authenticate_or_request_with_http_basic
有一个可选的 message
参数(不幸的是,这是参数列表中的第二个参数,因此 "Application"
是第一个参数)。
在 Rails 5 中只需将您的代码更改为:
def basic_authenticate
message = { status: false, message: 'basic authentication failed' }.to_json
authenticate_or_request_with_http_basic("Application", message) do |username, password|
username == 'test_name' && password == 'test_password'
end
end
实现在 Rails 6 中发生了变化,因此在 Rails 6 中,最基本的实现如下所示:
def basic_authenticate
message = { status: false, message: 'basic authentication failed' }.to_json
authenticate_or_request_with_http_basic(nil, message) do |username, password|
username == 'test_name' && password == 'test_password'
end
end
我有一个 Rails 5.2 应用程序处于 API 模式。如果请求提供了正确的基本身份验证凭据,将呈现预期的 JSON 数据 { status: true, data: 'test_user_data' }
。
users_controller.rb
class Api::UsersController < ApplicationController
before_action :basic_authenticate
def get_user_info
render json: { status: true, data: 'test_user_data' }
end
private
def basic_authenticate
authenticate_or_request_with_http_basic do |username, password|
username == 'test_name' && password == 'test_password'
end
end
end
application_controller.rb
class ApplicationController < ActionController::API
include ActionController::HttpAuthentication::Basic::ControllerMethods
end
但是,如果基本身份验证失败,则只会呈现纯文本 HTTP Basic: Access denied.
。
我想做的是在身份验证失败的情况下在 JSON 中呈现错误消息,例如 { status: false, message: 'basic authentication failed'}
.
修复它的正确方法是什么?
在你的 application_controller.rb
中使用救援,如下所示
rescue_from User::NotAuthorized, with: :deny_access # self defined exception
def deny_access
render json: { status: false, message: 'basic authentication failed'}
end
authenticate_or_request_with_http_basic
有一个可选的 message
参数(不幸的是,这是参数列表中的第二个参数,因此 "Application"
是第一个参数)。
在 Rails 5 中只需将您的代码更改为:
def basic_authenticate
message = { status: false, message: 'basic authentication failed' }.to_json
authenticate_or_request_with_http_basic("Application", message) do |username, password|
username == 'test_name' && password == 'test_password'
end
end
实现在 Rails 6 中发生了变化,因此在 Rails 6 中,最基本的实现如下所示:
def basic_authenticate
message = { status: false, message: 'basic authentication failed' }.to_json
authenticate_or_request_with_http_basic(nil, message) do |username, password|
username == 'test_name' && password == 'test_password'
end
end