用户名作为参数,包含黑名单验证

时间:2016-12-28 19:31:13

标签: ruby-on-rails

我使用用户模型,用户名作为参数而不是id。所以目前我的路线是这样的:

resources :u, param: :username, :as => :user, :controller => :user

但现在我想通过/:username访问用户个人资料,但我发现它有问题。我有/login/logout/settings等路线。用户可以更改其用户名。现在我该如何处理,以便用户不能拥有上述路线的用户名?

2 个答案:

答案 0 :(得分:1)

孤立地解决您的问题,您可以确保使用黑名单禁止冲突的用户名。

class User < ApplicationRecord
  validates :username, exclusion: { in: %w{ login logout settings }
end

在实践中,您还希望将可能误导或传达不当权限的用户名列入黑名单。例如,您不希望用户使用用户名“admin”,“administrator”或“site_owner”,因为它可能会混淆其他用户。

您还可以利用Rails优先路由(自上而下)的方式来确保命名路由始终优先于用户路由:

Rails.application.routes.draw do
  get :login, to: 'sessions#new'
  get '/:username', to: 'users#show'
end 

GET /login #=> sessions#new
GET /foo #=> users#show

这使您可以随时间添加额外的命名路由,这些路由将接管用户名路由,这是一个很好的二级保护。

有关实施虚荣网址和在路由中使用用户名(而不是ID)的更多信息,建议您查看Changing user params to include their username

读入列入黑名单的用户名文件进行验证的示例:

# app/models/concerns/blacklist.rb
module Blacklist
  def blacklist
    @_blacklist ||= File.readlines(Rails.root.join 'lib', 'blacklist.txt')
  end
end

# app/models/user.rb
class User < ApplicationRecord
  extend Blacklist
  validates :username, exclusion: { in: blacklist }
end

答案 1 :(得分:0)

这里有两种选择。第一个是根据您的问题的评论中的建议:列出已排除的用户名列表,并在允许用户创建帐户之前验证用户的用户名。 Here's an example of one such list you could use

第二种方法更简单:让用户以/u/username之类的方式进行直播,而不只是/username