我想问用户一个问题,并且只有在用户正确回答我的问题时才让他注册.我搜索了如何设法,但我的情况似乎并不存在.
有没有一种惯用的方法来处理这种情况?
第一个想法可能是使用javascript,但答案存储在LDAP中,我希望在rails中更容易处理.
我还在考虑禁用/users/sign_up
路由,devise/registration#new
手动调用action()并渲染视图(devise/registration/new
).
我能想到的另一种方法是运行一个后台守护进程,它将收集会话ID,用户可以正确回答问题.在正确答案中,用户将被重定向到公共可用的注册页面,该页面将使用守护程序检查用户的会话ID.
假设您已经签署了cookie数据(这是Rails 3中的默认值),您可以按照说法执行并使用会话:
# app/controllers/preauth_controller.rb def new end def create if params[:answer] == 'correct answer' session[:preauthorized] = true redirect_to sign_up_path end flash[:error] = 'Incorrect answer' render :new end # app/controllers/users_controller.rb before_filter :verify_preauth, only: [:new, :create] def verify_preauth redirect_to new_preauth_path unless session[:preauthorized] end
但是,如果cookie数据未签名,则preauthorized
密钥可能被客户端篡改,因此不应被信任.
如果您的页面在传输过程中使用HTTPS通过TLS加密,并且您没有任何XSS漏洞,那么这应该足够安全以满足您的需求.如果您认为这是一段特别敏感的代码,那么您需要的不仅仅是StackOverflow用户的想法,而是指导和实施保护应用程序安全的综合方法.