我使用用户模型,用户名作为参数而不是id。所以目前我的路线是这样的:
resources :u, param: :username, :as => :user, :controller => :user
但现在我想通过/:username
访问用户个人资料,但我发现它有问题。我有/login
,/logout
,/settings
等路线。用户可以更改其用户名。现在我该如何处理,以便用户不能拥有上述路线的用户名?
答案 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
。