Learn how to use a custom authentication setup with Spree
User
model exists in is already a Spree application.
User
, but for the purposes of this guide the model we will be referring to will be called User
. If your model is called something else, do some mental substitution wherever you see User
.1. Change the Spree.user_class
User
class, you must first edit Spree’s initializer located at config/initializers/spree.rb
by changing this line:2. Update User model
User
class as the class that represents users in Spree. Run the new migration by running this:lib/spree/current_user_helpers.rb
which will be automatically included in your application’s controllers allowing you to override the spree_current_user
method to return the current user of the request.3. Include User concerns in your User model
has_and_belongs_to_many
association called spree_roles
. This association will retrieve all the roles that a user has for Spree.The second of these is the spree_orders
association. This will return all orders associated with the user in Spree. There’s also a last_incomplete_spree_order
method which will return the last incomplete spree order for the user. This is used internal to Spree to persist order data across a user’s login sessions.The third and fourth associations are for address information for a user. When a user places an order, the address information for that order will be linked to that user so that it is available for subsequent orders.The next method is one called has_spree_role?
which can be used to check if a user has a specific role. This method is used internally to Spree to check if the user is authorized to perform specific actions, such as accessing the admin section. Admin users of your system should be assigned the Spree admin role, like this:has_spree_role?
method, like this:true
, then the user has admin permissions within Spree.4. Customize Spree Authentication Helpers (Optional)
spree_backend
and/or spree_frontend
gems.lib/spree/authentication_helpers.rb
which will contain the following code to help you do that:lib/spree/authentication_helpers.rb
which will contain the following code to help you do that:spree_current_user
Used to tell Spree what the current user of a request is.spree_login_path
The location of the login/sign in form in your application.spree_signup_path
The location of the sign up form in your application.spree_logout_path
The location of the logout feature of your application.spree_forgot_password_path
The location to reset a user’s password.spree_edit_password_path
The location to edit a user’s password.spree_admin_login_path
The location of the login/sign in form for the admin panel.spree_admin_logout_path
The location of the logout feature for the admin panel.main_app
prefixed if they are inside your application. This is because Spree will otherwise attempt to route these paths to the Spree engine, which does not exist. By prefixing with main_app
, you tell it to look at the application’s routes.You will need to define the login_path
, signup_path
and logout_path
routes yourself, by using code like this inside your application’s config/routes.rb
if you’re using Devise:devise_scope
method and change the controllers and actions for these routes.You can also customize these methods inside lib/spree/authentication_helpers.rb
to use the routing helper methods already provided by the authentication setup you have, if you wish.Any modifications made to lib/spree/authentication_helpers.rb
while the server is running will require a restart, as with any other modification to other files in lib
.5. Remove Auth Devise gem
spree_auth_devise
gem is not needed when using an existing application authentication unless the goal is to have two separate authentication methods.You can remove the spree_auth_devise
gem by running this command:config/initializers/spree.rb
file:
AdminUser
model for the admin panel. You will need to create this model in your application and ensure that it includes the necessary Spree fields.