2017-12-18 1 views
0

Ich habe ein einziges Gerät Benutzermodell. Eine Benutzerrolle kann sein: A, B oder admin.Rails, Benutzerrolle bei der Anmeldung mit Gerät mit versteckten Feldern

Wenn ich mich das erste Mal anmelde, möchte ich die Benutzerrolle basierend auf einer von zwei Schaltflächen festlegen - Button A oder Button B. Ich werde dann die Website basierend auf diesen Rollen anpassen.

Mein aktueller Versuch ist jede Taste (A oder B) Seiten mit versteckten Feldern mit devise Formen zu trennen zu verknüpfen, das entweder A oder B.

Derzeit erhalte ich unpermitted params gehört: Rolle in meinem Logs, wenn so tun. Heres meiner Nutzer entwickeln Controller:

class Users::RegistrationsController < 
    Devise::RegistrationsController 
    before_action :configure_sign_up_params, only: [:create] 
    before_action :configure_account_update_params, only: [:update] 

    protected 

    # If you have extra params to permit, append them to the sanitizer. 
    def configure_sign_up_params 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:role]) 
    end 

    # If you have extra params to permit, append them to the sanitizer. 
    def configure_account_update_params 
    devise_parameter_sanitizer.permit(:account_update, keys: [:role]) 
    end 

    end 

ich auch nicht sicher bin, ob diese Art und Weise eine Rolle bei der Einstellung in Bezug sicher ist, dass ein Bösewicht der Lage sein, meint ihre Rolle als Admin irgendwie diese Weise einzustellen.

Also ich vermute, es gibt einen sichereren oder einfacheren Weg, die Dinge hier zu tun.

Form - hat man für B-Feld versteckt und man hat A.

 <%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
     <%= devise_error_messages! %> 
     <%= f.input :email %> 
     <%= f.input :password %> 
     <%= f.input :password_confirmation %> 
     <%= f.hidden_field :role, value: 'A' %> 
     <%= f.button :submit, "Sign up" %> 
    <% end %> 
+0

ich einige View-Code schreiben würde diese Frage ein wenig klarer machen :) Tut mir klingen wie es auf der Sicherheitsfront von fehlt, was dort bis jetzt. – SRack

Antwort

2

Im Allgemeinen sollten Sie nie, nie, akzeptieren Berechtigungsinformationen in einem Anmeldeformular.

Was würde den Benutzer daran hindern, die versteckte HTML-Eingabe für Wert auf admin oder andere zu ändern? Ich gehe davon aus, dass Sie die Spalte für zusätzliche Berechtigungsinformationen verwenden.

Ich würde Ihnen vorschlagen:

  1. Nicht Rolle params aus der von
  2. Verwenden Sie eine separate Spalte visuelle Layouts als Berechtigungen angeben akzeptieren, da dies wahrscheinlich zu widersprüchlichen Bedenken führen schließlich

Wenn Sie sind verpflichtet, verwenden, um das role Attribut als Code erwähnt, würde ich vorschlagen, den Wert manuell in Ihrem Controller Einstellung auf Basis einen nicht-beharren Wert in der Form übergeben.

Form:

<%= hidden_field_tag :layout, value: 'A' %> 

Controller:

class Users::RegistrationsController < Devise::RegistrationsController 
    after_action :set_layout, only: [:create] 

    protected 

    def set_layout 
    @resource.update(role: selected_layout) 
    end 

    # This will whitelist the possible options 
    def selected_layout 
    ["A", "Other"].find { |layout_option| layout_option == params[:layout] } 
    end 
end 
Verwandte Themen