|
- #coding=utf-8
-
- require 'base64'
- require 'json'
- require 'openssl'
-
- ## 单点登录 <=> 北斗
- class SsosController < ApplicationController
-
- skip_before_filter :check_if_login_required
- layout false
-
- def show
- begin
- # suRh2nFEJd0Ai_TFbqZ-1yQXnGfIB-YD_f4KTA3O4dQGSBMiXfOMt-0mzizgXekWTjHKfn62nJ60iHM3_eY_KS0Qn8SF8vANfa46GhzZRt4T0iC5ZOSs4cWeK43OU0RoekQLZZAo5OyOVibxabmiPGzEFCnVVtdmRk9d7X_B0Is=
- @auth = params[:auth]
- @options = parse(params[:auth])
-
- if params[:login].present?
- @options["name"] = params[:login]
- end
-
- logger.debug @options
- ## 认证
- sso = login(@options)
-
- ## 加入组织
- @organization = Organization.find(82)
- unless @organization.org_members.exists?(user_id: sso.user_id)
- member = OrgMember.create(:user_id => sso.user_id, :created_at => Time.now)
- # member = OrgMember.new(:user_id => sso.user_id)
- @organization.org_members << member
- OrgMemberRole.create(:org_member_id => member.id, :role_id => 12)
- end
-
- ## 选择性跳转
- redirect_to @organization
- rescue => e
- logger.error e
- if e.message == "exist user"
- render 'ssos/show', :layout => false
- else
- raise e
- end
- end
- end
-
- ## 改用户名
- def create
- show and return
- end
-
- private
- def base64_safe(content)
- content = content.gsub('-', '+')
- content.gsub('_', '/')
- end
-
- def parse(auth)
- content = decrypt(auth)
- ActiveSupport::JSON.decode(content)
- end
-
- def login(opt)
- sso = Sso.sync_user(opt)
- start_user_session(sso.user)
- sso
- end
-
- def decrypt(auth)
- crypted_str = Base64.decode64(base64_safe(auth))
- pkey = OpenSSL::PKey::RSA.new(File.new(File.join(Rails.root,"config/private.key")))
-
- #to large
- max_dec_len = 1024/8
- size = (crypted_str.size + max_dec_len-1) / max_dec_len
-
- content = ''
- size.times do |time|
- tmps = crypted_str[time*max_dec_len, max_dec_len]
- content += pkey.private_decrypt(tmps,OpenSSL::PKey::RSA::PKCS1_PADDING)
- end
- content
- end
-
- end
|