- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个受 Devise/CanCan 使用 :authenticate_user!
和 load_and_authorize_resource
保护的 Controller 。我必须添加 :except => [:sort]
才能让我的 sort
操作在 javascript 中工作,因为 javascript 连接到 sort
操作不包括 current_user
或其 Angular 色。
我已经通过使用 gon 解决了这个问题传递 current_user
的 Role(如果没有 current_user
,则传递 'anonymous')。我不确定这在 JavaScript 端是否安全(也许可以在浏览器的控制台中设置/覆盖变量),而且我确定我的 sort
操作不安全,因为我已将其打开以供直接 POST 访问 - 我通过发送操作正确的参数使用 RESTed 对此进行了测试,这导致了数据的重新排序。
那么:我如何启用从 JavaScript 安全访问受 Devise/CanCan 保护的 Rails Controller ?
这是我的 Rails 应用程序的详细信息...
这是( chop 的) Controller ,显示我如何从 Devise/CanCan 中免除 sort
操作并将 gon.current_user_role
变量设置为 Role current_user
,如果可用:
class ThingsController < ApplicationController
before_filter :authenticate_user!, :except => [:sort]
load_and_authorize_resource :except => [:sort]
def show
@thing = Thing.find(params[:id])
if current_user
gon.current_user_role = current_user.role
else
gon.current_user_role = "anonymous"
end
respond_to do |format|
format.html
end
end
def sort
params[:thing].each_with_index do |id, index|
Thing.update_all({position: index+1}, {id: id})
end
render nothing: true
end
end
在我看来,我有一个未排序的项目列表,只能由具有“admin” Angular 色的用户排序:
<ul class="things" data-update-url="<%= sort_things_url %>">
<% @things.each do |t| %>
<%= content_tag_for(:li, t) do %>
<%= image_tag t.image %>
<% end %>
<% end %>
</ul>
这是 application.js 文件中的 javascript,如果 gon.current_user_role
变量是“admin”,我只在其中使列表可排序:
$(function() {
if (gon.current_user_role == "admin")
{
$( ".things" ).sortable({
update: function() {
return $.post($(this).data('update-url'), $(this).sortable('serialize'));
}
});
$( ".things" ).disableSelection();
}
});
最后,我的 routes.rb 文件打开了对 POST 调用的 sort
操作:
resources :things do
collection { post :sort }
end
最佳答案
我误认为 JavaScript 与排序操作的连接不包括 current_user
或其 Angular 色。我弄错的原因是因为我正在使用 Pow ,所以我一直在访问我的 Rails 应用程序 http://railsapp.dev ...但是我的 JavaScript 请求被标记为来自 127.0.0.1 ...所以它们被视为 XSS 请求。
当我使用 rails s
启动标准 Rails 服务器时,或者当我在暂存服务器上进行这些尝试时,JavaScript 知道 current_user
。
我的 Controller 最终是这样的:
class ThingsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource
def show
@thing = Thing.find(params[:id])
if current_user
gon.current_user_role = current_user.role
else
gon.current_user_role = "anonymous"
end
respond_to do |format|
format.html
end
end
def sort
params[:thing].each_with_index do |id, index|
Thing.update_all({position: index+1}, {id: id})
end
render nothing: true
end
end
我的 View 和 JavaScript 保持不变。
此设置不允许对 sort
操作进行任意 POST 调用,并且还可以防止没有“admin” Angular 色的人重新排列项目。如果有人确实弄清楚了如何操作 gon.current_user_role
JavaScript 变量,他们将能够明显地重新排列页面上的项目,但这种重新排列不会存储在数据库,因为 sort
操作将不允许请求(并且它们的更改将在下一个页面加载时恢复)。
此设置无法解决我的 Pow 问题,但我可以接受。
关于javascript - 如何保护我对 Devise/CanCan/JavaScript 的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126711/
我已将 Devise 设置为允许使用电子邮件或用户名登录。使用您的用户名,您可以拥有一个个性网址,如下所示:vanity.com/username。因此,我的用户模型具有 attr_accessibl
我有个类似的问题。我正在使用sendmail选项,并继续出现错误 “发送邮件需要使用SMTP发件人地址。设置邮件 smtp_envelope_from,return_path,发件人或地址。” 我已经
我在为我的用户表做种子时遇到问题。 (rails 3.2.6,jruby 1.6.7.2,devise 2.1.2) 这是一个非常通用的用户表,由“rails generate devise User
我为公司设计了一个设计。我做了一个表用户,希望我想存储用户信息密码等。当用户注册时,我希望它创建一个新用户和公司的关联。 我的公司模型:has_one:用户我的用户模型:Belongs_to: 公司
我目前正在从我们的应用程序中删除 IP 日志记录,我想知道使用 Devise 执行此操作的最佳方法是什么? 最佳答案 你的答案看起来不错,但如果你只想跟踪特定用户的 IP,一个(不那么冗长但可能更令人
我有一个包含 Devise (2.2.3) 和 Active Admin (0.5.1) 的应用程序,我先安装了 Devise,然后安装了 Active Admin。整个应用程序需要登录,所以在我的应
我有一个包含 Devise (2.2.3) 和 Active Admin (0.5.1) 的应用程序,我先安装了 Devise,然后安装了 Active Admin。整个应用程序需要登录,所以在我的应
我在 API 模式下使用 Rails,使用 Devise 和 Devise JWT(用于 API)和 ActiveAdmin。我一切正常,但我一直在构建 API Controller ,现在 Acti
在使用 Devise TestHelpers 的文档中,它声明使用诸如... @request.env["devise.mapping"] = Devise.mappings[:admin] 或者 @
许多程序员使用 devise 作为他们的身份验证解决方案,我想听听他们的建议: Devise 已经过测试,但我想知道是否有我自己要测试的东西(集成/单元/功能测试?),以根据我的知识进行标准设计集成(
我正在尝试通过 JSON 注册设备用户,但一直收到 ActiveModel::ForbiddenAttributesError class Api::V1::RegistrationsControll
我正在使用 Rails 4.0.2 和 Devise 3.2.2 来处理用户注册/身份验证。 我已经用谷歌搜索并在 stackoverflow 上搜索答案,但找不到可以回答我的问题的东西。 下面的代码
我正在使用 ruby 2.2.3 和 rails 4.2.5。我无法在我的项目上运行 rails generate devise:install。 Bundler 抛出错误。错误如下 rails
我正在使用设计和 devise-basecamper用于使用我的基于子域的 Web 应用程序进行身份验证。 我想允许 super 用户访问任何帐户(基本上是任何子域)。 我不确定我将如何实现这一点,以
我正在为我的应用程序实现设计邮件程序,我已完成以下步骤: 在模型中: class User "smtp.gmail.com", :port => 587, :domain =
我在 SO 上找到了类似的线程,但没有一个帮助我解决了这个问题。我的路线如下: devise_for :users do post '/users' => 'registrations#cre
编辑 2:看起来对我来说一个快速的临时修复是在我的 link_to_unless_current 和 current_page 方法中的 Controller 名称前面添加一个正斜杠“/”。例如 '
由于无法控制的原因,我无法在当前项目中使用RSpec进行测试。我正在尝试测试“设计重置密码”,但似乎无法提出有用的建议。 这是我到目前为止的内容: require 'test_helper' clas
我有一个问题,一开始看起来并不难,但实际上我无法解决。我正在尝试将 Refinery 用作应用程序的 CMS。我想将 Refinery 用户和其他类型的用户分开,称他们为 mktgeistusers,
我想自定义以下由devise提供的flash msg 在 devise.en.yml 文件中: devise: failure: unconfirmed: 'You have to
我是一名优秀的程序员,十分优秀!