mirror of
https://github.com/projekteuler/projekteuler.git
synced 2025-12-10 08:46:41 +01:00
Use Omniauthable user model with admin role
This commit is contained in:
parent
52c8e3d7d2
commit
b0f8bc5090
2
Gemfile
2
Gemfile
@ -48,6 +48,8 @@ gem 'will_paginate-bootstrap', '~> 1.0.1'
|
|||||||
|
|
||||||
gem 'devise', '~> 4.5.0'
|
gem 'devise', '~> 4.5.0'
|
||||||
gem 'devise-bootstrap-views', '~> 0.0.11'
|
gem 'devise-bootstrap-views', '~> 0.0.11'
|
||||||
|
gem 'omniauth'
|
||||||
|
gem 'omniauth-github'
|
||||||
|
|
||||||
gem 'codemirror-rails', '~> 5.16.0'
|
gem 'codemirror-rails', '~> 5.16.0'
|
||||||
# Use ActiveModel has_secure_password
|
# Use ActiveModel has_secure_password
|
||||||
|
|||||||
23
Gemfile.lock
23
Gemfile.lock
@ -85,11 +85,14 @@ GEM
|
|||||||
docile (1.3.1)
|
docile (1.3.1)
|
||||||
erubi (1.8.0)
|
erubi (1.8.0)
|
||||||
execjs (2.7.0)
|
execjs (2.7.0)
|
||||||
|
faraday (0.15.4)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
ffi (1.9.25)
|
ffi (1.9.25)
|
||||||
ffi (1.9.25-x64-mingw32)
|
ffi (1.9.25-x64-mingw32)
|
||||||
ffi (1.9.25-x86-mingw32)
|
ffi (1.9.25-x86-mingw32)
|
||||||
globalid (0.4.2)
|
globalid (0.4.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
|
hashie (3.6.0)
|
||||||
i18n (0.9.5)
|
i18n (0.9.5)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
jbuilder (2.8.0)
|
jbuilder (2.8.0)
|
||||||
@ -100,6 +103,7 @@ GEM
|
|||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (1.8.6)
|
json (1.8.6)
|
||||||
|
jwt (2.1.0)
|
||||||
loofah (2.2.3)
|
loofah (2.2.3)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
@ -116,6 +120,8 @@ GEM
|
|||||||
msgpack (1.2.6-x64-mingw32)
|
msgpack (1.2.6-x64-mingw32)
|
||||||
msgpack (1.2.6-x86-mingw32)
|
msgpack (1.2.6-x86-mingw32)
|
||||||
multi_json (1.13.1)
|
multi_json (1.13.1)
|
||||||
|
multi_xml (0.6.0)
|
||||||
|
multipart-post (2.0.0)
|
||||||
mysql2 (0.5.2)
|
mysql2 (0.5.2)
|
||||||
mysql2 (0.5.2-x64-mingw32)
|
mysql2 (0.5.2-x64-mingw32)
|
||||||
mysql2 (0.5.2-x86-mingw32)
|
mysql2 (0.5.2-x86-mingw32)
|
||||||
@ -126,6 +132,21 @@ GEM
|
|||||||
mini_portile2 (~> 2.4.0)
|
mini_portile2 (~> 2.4.0)
|
||||||
nokogiri (1.10.1-x86-mingw32)
|
nokogiri (1.10.1-x86-mingw32)
|
||||||
mini_portile2 (~> 2.4.0)
|
mini_portile2 (~> 2.4.0)
|
||||||
|
oauth2 (1.4.1)
|
||||||
|
faraday (>= 0.8, < 0.16.0)
|
||||||
|
jwt (>= 1.0, < 3.0)
|
||||||
|
multi_json (~> 1.3)
|
||||||
|
multi_xml (~> 0.5)
|
||||||
|
rack (>= 1.2, < 3)
|
||||||
|
omniauth (1.9.0)
|
||||||
|
hashie (>= 3.4.6, < 3.7.0)
|
||||||
|
rack (>= 1.6.2, < 3)
|
||||||
|
omniauth-github (1.3.0)
|
||||||
|
omniauth (~> 1.5)
|
||||||
|
omniauth-oauth2 (>= 1.4.0, < 2.0)
|
||||||
|
omniauth-oauth2 (1.6.0)
|
||||||
|
oauth2 (~> 1.1)
|
||||||
|
omniauth (~> 1.9)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
rack (2.0.6)
|
rack (2.0.6)
|
||||||
rack-test (1.1.0)
|
rack-test (1.1.0)
|
||||||
@ -240,6 +261,8 @@ DEPENDENCIES
|
|||||||
jbuilder (~> 2.8.0)
|
jbuilder (~> 2.8.0)
|
||||||
jquery-rails (~> 4.3.3)
|
jquery-rails (~> 4.3.3)
|
||||||
mysql2 (~> 0.5.2)
|
mysql2 (~> 0.5.2)
|
||||||
|
omniauth
|
||||||
|
omniauth-github
|
||||||
rails (= 5.2.2)
|
rails (= 5.2.2)
|
||||||
rails-controller-testing
|
rails-controller-testing
|
||||||
rails-i18n (~> 5.1.3)
|
rails-i18n (~> 5.1.3)
|
||||||
|
|||||||
@ -1,3 +1,8 @@
|
|||||||
class AdminController < ApplicationController
|
class AdminController < ApplicationController
|
||||||
before_action :authenticate_admin!
|
before_action :authenticate!
|
||||||
|
|
||||||
|
def authenticate!
|
||||||
|
authenticate_user!
|
||||||
|
raise SecurityError unless current_user.admin?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
14
app/controllers/users/omniauth_callbacks_controller.rb
Normal file
14
app/controllers/users/omniauth_callbacks_controller.rb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
||||||
|
skip_before_action :verify_authenticity_token
|
||||||
|
|
||||||
|
def sign_in_with(provider_name)
|
||||||
|
@user = User.from_omniauth(request.env["omniauth.auth"])
|
||||||
|
@user.remember_me!
|
||||||
|
sign_in_and_redirect @user, event: :authentication
|
||||||
|
set_flash_message(:notice, :success, kind: provider_name) if is_navigational_format?
|
||||||
|
end
|
||||||
|
|
||||||
|
def developer
|
||||||
|
sign_in_with "Developer"
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,6 +0,0 @@
|
|||||||
class Admin < ApplicationRecord
|
|
||||||
# Include default devise modules. Others available are:
|
|
||||||
# :confirmable, :lockable, :timeoutable and :omniauthable
|
|
||||||
devise :database_authenticatable,
|
|
||||||
:recoverable, :rememberable, :trackable, :validatable
|
|
||||||
end
|
|
||||||
11
app/models/user.rb
Normal file
11
app/models/user.rb
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
class User < ApplicationRecord
|
||||||
|
devise :omniauthable, :rememberable
|
||||||
|
|
||||||
|
enum role: [:user, :admin]
|
||||||
|
|
||||||
|
def self.from_omniauth(auth)
|
||||||
|
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
|
||||||
|
user.name = auth.info.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -6,16 +6,17 @@
|
|||||||
<%= nav class: 'navbar-left' do %>
|
<%= nav class: 'navbar-left' do %>
|
||||||
<%= link_to t('application.info'), about_info_path %>
|
<%= link_to t('application.info'), about_info_path %>
|
||||||
<%= link_to Problem.model_name.human(count: 2), problems_path %>
|
<%= link_to Problem.model_name.human(count: 2), problems_path %>
|
||||||
<% if admin_signed_in? %>
|
<% if user_signed_in? and current_user.admin? %>
|
||||||
<%= link_to t('admin.dashboard.index.administration'), admin_dashboard_index_path %>
|
<%= link_to t('admin.dashboard.index.administration'), admin_dashboard_index_path %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= nav class: 'navbar-right' do %>
|
<%= nav class: 'navbar-right' do %>
|
||||||
<%= link_to t('application.legal'), about_legal_path %>
|
<%= link_to t('application.legal'), about_legal_path %>
|
||||||
<% if admin_signed_in? %>
|
<% if user_signed_in? %>
|
||||||
<%= link_to(t('application.sign_out'), destroy_admin_session_path, method: :delete) %>
|
<li>Eingeloggt als <b><%= current_user.name %></b></li>
|
||||||
|
<%= link_to(t('application.sign_out'), destroy_user_session_path, method: :delete) %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= link_to(t('application.sign_in'), new_admin_session_path) %>
|
<%= link_to(t('application.sign_in'), user_developer_omniauth_authorize_path) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@ -233,6 +233,7 @@ Devise.setup do |config|
|
|||||||
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
# Add a new OmniAuth provider. Check the wiki for more information on setting
|
||||||
# up on your models and hooks.
|
# up on your models and hooks.
|
||||||
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
|
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
|
||||||
|
config.omniauth :developer, fields: [:name], uid_field: :name
|
||||||
|
|
||||||
# ==> Warden configuration
|
# ==> Warden configuration
|
||||||
# If you want to use other strategies, that are not supported by Devise, or
|
# If you want to use other strategies, that are not supported by Devise, or
|
||||||
|
|||||||
@ -22,7 +22,13 @@ Rails.application.routes.draw do
|
|||||||
resources :translations, only: [:new, :create]
|
resources :translations, only: [:new, :create]
|
||||||
end
|
end
|
||||||
|
|
||||||
devise_for :admins, skip: :registrations
|
devise_for :users, :controllers => {
|
||||||
|
:omniauth_callbacks => "users/omniauth_callbacks"
|
||||||
|
}
|
||||||
|
devise_scope :user do
|
||||||
|
delete 'sign_out', :to => 'devise/sessions#destroy', :as => :destroy_user_session
|
||||||
|
end
|
||||||
|
|
||||||
namespace :admin do
|
namespace :admin do
|
||||||
get '', to: 'dashboard#index', as: 'dashboard_index'
|
get '', to: 'dashboard#index', as: 'dashboard_index'
|
||||||
post '/update_problem_count', to: 'dashboard#update_problem_count', as: 'dashboard_update_problem_count'
|
post '/update_problem_count', to: 'dashboard#update_problem_count', as: 'dashboard_update_problem_count'
|
||||||
|
|||||||
53
db/migrate/20190203145552_devise_create_users.rb
Normal file
53
db/migrate/20190203145552_devise_create_users.rb
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :users do |t|
|
||||||
|
## OmniAuth-able
|
||||||
|
t.string :provider, null: false
|
||||||
|
t.string :uid, null: false
|
||||||
|
|
||||||
|
## User role
|
||||||
|
t.integer :role, default: 0
|
||||||
|
|
||||||
|
## Rememberable
|
||||||
|
t.datetime :remember_created_at
|
||||||
|
|
||||||
|
|
||||||
|
## Database authenticatable
|
||||||
|
# t.string :email, null: false, default: ""
|
||||||
|
# t.string :encrypted_password, null: false, default: ""
|
||||||
|
|
||||||
|
## Recoverable
|
||||||
|
# t.string :reset_password_token
|
||||||
|
# t.datetime :reset_password_sent_at
|
||||||
|
|
||||||
|
|
||||||
|
## Trackable
|
||||||
|
# t.integer :sign_in_count, default: 0, null: false
|
||||||
|
# t.datetime :current_sign_in_at
|
||||||
|
# t.datetime :last_sign_in_at
|
||||||
|
# t.string :current_sign_in_ip
|
||||||
|
# t.string :last_sign_in_ip
|
||||||
|
|
||||||
|
## Confirmable
|
||||||
|
# t.string :confirmation_token
|
||||||
|
# t.datetime :confirmed_at
|
||||||
|
# t.datetime :confirmation_sent_at
|
||||||
|
# t.string :unconfirmed_email # Only if using reconfirmable
|
||||||
|
|
||||||
|
## Lockable
|
||||||
|
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
||||||
|
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
||||||
|
# t.datetime :locked_at
|
||||||
|
|
||||||
|
|
||||||
|
t.timestamps null: false
|
||||||
|
end
|
||||||
|
|
||||||
|
# add_index :users, :email, unique: true
|
||||||
|
# add_index :users, :reset_password_token, unique: true
|
||||||
|
# add_index :users, :confirmation_token, unique: true
|
||||||
|
# add_index :users, :unlock_token, unique: true
|
||||||
|
end
|
||||||
|
end
|
||||||
5
db/migrate/20190203150923_add_name_to_users.rb
Normal file
5
db/migrate/20190203150923_add_name_to_users.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class AddNameToUsers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :users, :name, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
8
db/migrate/20190203164629_drop_admins.rb
Normal file
8
db/migrate/20190203164629_drop_admins.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
class DropAdmins < ActiveRecord::Migration[5.2]
|
||||||
|
def up
|
||||||
|
drop_table :admins
|
||||||
|
end
|
||||||
|
def down
|
||||||
|
fail ActiveRecord::IrreversibleMigration
|
||||||
|
end
|
||||||
|
end
|
||||||
29
db/schema.rb
29
db/schema.rb
@ -10,24 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2019_02_02_113250) do
|
ActiveRecord::Schema.define(version: 2019_02_03_164629) do
|
||||||
|
|
||||||
create_table "admins", force: :cascade do |t|
|
|
||||||
t.string "email", default: "", null: false
|
|
||||||
t.string "encrypted_password", default: "", null: false
|
|
||||||
t.string "reset_password_token"
|
|
||||||
t.datetime "reset_password_sent_at"
|
|
||||||
t.datetime "remember_created_at"
|
|
||||||
t.integer "sign_in_count", default: 0, null: false
|
|
||||||
t.datetime "current_sign_in_at"
|
|
||||||
t.datetime "last_sign_in_at"
|
|
||||||
t.string "current_sign_in_ip"
|
|
||||||
t.string "last_sign_in_ip"
|
|
||||||
t.datetime "created_at"
|
|
||||||
t.datetime "updated_at"
|
|
||||||
t.index ["email"], name: "index_admins_on_email", unique: true
|
|
||||||
t.index ["reset_password_token"], name: "index_admins_on_reset_password_token", unique: true
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table "problems", force: :cascade do |t|
|
create_table "problems", force: :cascade do |t|
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
@ -46,4 +29,14 @@ ActiveRecord::Schema.define(version: 2019_02_02_113250) do
|
|||||||
t.index ["problem_id"], name: "index_translations_on_problem_id"
|
t.index ["problem_id"], name: "index_translations_on_problem_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "users", force: :cascade do |t|
|
||||||
|
t.string "provider", null: false
|
||||||
|
t.string "uid", null: false
|
||||||
|
t.integer "role", default: 0
|
||||||
|
t.datetime "remember_created_at"
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.string "name"
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4,7 +4,7 @@ class Admin::DashboardControllerTest < ActionDispatch::IntegrationTest
|
|||||||
include Devise::Test::IntegrationHelpers
|
include Devise::Test::IntegrationHelpers
|
||||||
|
|
||||||
setup do
|
setup do
|
||||||
login
|
login_admin
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should get index" do
|
test "should get index" do
|
||||||
|
|||||||
@ -4,7 +4,7 @@ class Admin::TranslationsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
include Devise::Test::IntegrationHelpers
|
include Devise::Test::IntegrationHelpers
|
||||||
|
|
||||||
setup do
|
setup do
|
||||||
login
|
login_admin
|
||||||
@translation = translations(:translation_one)
|
@translation = translations(:translation_one)
|
||||||
@translation_alternative = translations(:translation_two_alternative)
|
@translation_alternative = translations(:translation_two_alternative)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4,7 +4,14 @@
|
|||||||
# model remove the '{}' from the fixture names and add the columns immediately
|
# model remove the '{}' from the fixture names and add the columns immediately
|
||||||
# below each fixture, per the syntax in the comments below
|
# below each fixture, per the syntax in the comments below
|
||||||
#
|
#
|
||||||
|
|
||||||
admin:
|
admin:
|
||||||
email: admin@example.com
|
provider: github
|
||||||
encrypted_password: <%= Devise::Encryptor.digest(Admin, 'password') %>
|
uid: admin
|
||||||
|
name: admin
|
||||||
|
role: 1
|
||||||
|
|
||||||
|
translator:
|
||||||
|
provider: github
|
||||||
|
uid: translator
|
||||||
|
name: translator
|
||||||
|
role: 0
|
||||||
@ -1,6 +1,6 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class AdminTest < ActiveSupport::TestCase
|
class UserTest < ActiveSupport::TestCase
|
||||||
# test "the truth" do
|
# test "the truth" do
|
||||||
# assert true
|
# assert true
|
||||||
# end
|
# end
|
||||||
@ -10,8 +10,13 @@ class ActiveSupport::TestCase
|
|||||||
fixtures :all
|
fixtures :all
|
||||||
|
|
||||||
# Add more helper methods to be used by all tests here...
|
# Add more helper methods to be used by all tests here...
|
||||||
def login
|
def login_admin
|
||||||
admin = admins(:admin)
|
admin = users(:admin)
|
||||||
sign_in admin
|
sign_in admin
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def login_translator
|
||||||
|
translator = users(:translator)
|
||||||
|
sign_in translator
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user