From 080026fe3843098e06d6885488479656e53d1faf Mon Sep 17 00:00:00 2001 From: anke1460 Date: Tue, 18 Feb 2020 09:40:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 ++ app/controllers/oauth/cas_controller.rb | 13 ++++++++ app/models/open_users/cas.rb | 9 ++++++ .../oauth/create_or_find_cas_user_service.rb | 32 +++++++++++++++++++ config/application.rb | 4 +++ config/routes.rb | 6 ++-- 6 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 app/controllers/oauth/cas_controller.rb create mode 100644 app/models/open_users/cas.rb create mode 100644 app/services/oauth/create_or_find_cas_user_service.rb diff --git a/Gemfile b/Gemfile index 859090feb..e454889f6 100644 --- a/Gemfile +++ b/Gemfile @@ -49,6 +49,8 @@ gem 'rqrcode_png' gem 'acts-as-taggable-on', '~> 6.0' +gem 'omniauth-cas' + group :development, :test do gem 'rspec-rails', '~> 3.8' end diff --git a/app/controllers/oauth/cas_controller.rb b/app/controllers/oauth/cas_controller.rb new file mode 100644 index 000000000..c42e23303 --- /dev/null +++ b/app/controllers/oauth/cas_controller.rb @@ -0,0 +1,13 @@ +class Oauth::CasController < Oauth::BaseController + def create + user, is_new_user = Oauth::CreateORFindCasUserService.call(current_user, auth_hash) + successful_authentication(user) + + render_ok(new_user: is_new_user) + end + + + def auth_hash + request.env['omniauth.auth'] + end +end \ No newline at end of file diff --git a/app/models/open_users/cas.rb b/app/models/open_users/cas.rb new file mode 100644 index 000000000..301a197a0 --- /dev/null +++ b/app/models/open_users/cas.rb @@ -0,0 +1,9 @@ +class OpenUsers::Cas < OpenUser + def nickname + extra&.[]('nickname') + end + + def en_type + 'cas' + end +end \ No newline at end of file diff --git a/app/services/oauth/create_or_find_cas_user_service.rb b/app/services/oauth/create_or_find_cas_user_service.rb new file mode 100644 index 000000000..c36a23404 --- /dev/null +++ b/app/services/oauth/create_or_find_cas_user_service.rb @@ -0,0 +1,32 @@ +class Oauth::CreateORFindCasUserService < ApplicationService + + def initialize(user, params) + @user = user + @params = params + end + + def call + return [@user, false] if @user + + open_user = OpenUsers::Cas.find_or_initialize_by(uid: @params.info['email']) do |u| + u.extra = @params.info + end + + return [open_user.user, false] if open_user.persisted? + + @user = User.new(login: User.generate_login('C'), type: 'User', status: User::STATUS_ACTIVE) + + ActiveRecord::Base.transaction do + gender = @params.dig('extra', 'raw_info', 'xb') == '女' ? 1 : 0 + @user.save! + @user.create_user_extension!(gender: gender) + + open_user.user = @user + open_user.save! + + Rails.cache.write(open_user.can_bind_cache_key, 1, expires_in: 1.hours) + end + + [@user, true] + end +end \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index baa0011f2..db0204d49 100644 --- a/config/application.rb +++ b/config/application.rb @@ -29,6 +29,10 @@ module Educoderplus # job config.active_job.queue_adapter = :sidekiq + config.middleware.use OmniAuth::Builder do + provider :cas, url: 'http://localhost:3200' + end + config.middleware.insert_before 0, Rack::Cors do allow do origins '*' diff --git a/config/routes.rb b/config/routes.rb index 9eef49bfc..6c58024da 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,8 +8,8 @@ Rails.application.routes.draw do get 'attachments/download/:id/:filename', to: 'attachments#show' get 'auth/qq/callback', to: 'oauth/qq#create' get 'auth/failure', to: 'oauth/base#auth_failure' + get 'auth/cas/callback', to: 'oauth/cas#create' - resources :edu_settings scope '/api' do @@ -26,7 +26,7 @@ Rails.application.routes.draw do put 'commons/unhidden', to: 'commons#unhidden' delete 'commons/delete', to: 'commons#delete' - resources :jupyters do + resources :jupyters do collection do get :save_with_tpi get :save_with_tpm @@ -42,7 +42,7 @@ Rails.application.routes.draw do post :import_with_tpm end end - + resources :memos do member do post :sticky_or_cancel