gpt4 book ai didi

ruby-on-rails - 用户名作为参数与黑名单验证

转载 作者:行者123 更新时间:2023-12-05 05:22:07 24 4
gpt4 key购买 nike

我正在使用用户模型作为参数而不是 id 作为参数。所以目前我的 route 有这个:

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

但现在我想通过 /:username 访问用户配置文件,但我发现它有问题。我有像 /login/logout/settings 这样的路由。用户可以更改他的用户名。现在我该如何处理,以便用户不能拥有像上面这样的路由的用户名?

最佳答案

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

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

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

有关实现个性化 URL 和在路由中使用用户名(而不是 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

关于ruby-on-rails - 用户名作为参数与黑名单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41368523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com