parent
df41f7328f
commit
dfdd301f2f
@ -1,45 +0,0 @@
|
|||||||
#coding=utf-8
|
|
||||||
|
|
||||||
require 'base64'
|
|
||||||
require 'json'
|
|
||||||
require 'openssl'
|
|
||||||
|
|
||||||
## 单点登录 <=> 北斗
|
|
||||||
class SsoController < ApplicationController
|
|
||||||
|
|
||||||
skip_before_filter :check_if_login_required
|
|
||||||
|
|
||||||
def index
|
|
||||||
options = parse(params[:auth])
|
|
||||||
|
|
||||||
logger.debug options
|
|
||||||
|
|
||||||
## 认证
|
|
||||||
login(options[:id])
|
|
||||||
|
|
||||||
## 选择性跳转
|
|
||||||
|
|
||||||
redirect_to Organization.find(82)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def base64_safe(content)
|
|
||||||
content = content.gsub('-', '+')
|
|
||||||
content.gsub('_', '/')
|
|
||||||
end
|
|
||||||
|
|
||||||
def parse(auth)
|
|
||||||
crypted_str = Base64.decode64(base64_safe(auth))
|
|
||||||
pkey = OpenSSL::PKey::RSA.new(File.new(File.join(Rails.root,"config/private.key")))
|
|
||||||
content = pkey.private_decrypt(crypted_str,OpenSSL::PKey::RSA::PKCS1_PADDING)
|
|
||||||
# content = pkey.private_decrypt(crypted_str)
|
|
||||||
ActiveSupport::JSON.decode(content)
|
|
||||||
end
|
|
||||||
|
|
||||||
def login(id)
|
|
||||||
sso = Sso.find(id)
|
|
||||||
start_user_session(sso.user)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
@ -0,0 +1,66 @@
|
|||||||
|
#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
|
||||||
|
## 认证
|
||||||
|
login(@options)
|
||||||
|
|
||||||
|
logger.debug "login over"
|
||||||
|
|
||||||
|
## 选择性跳转
|
||||||
|
|
||||||
|
redirect_to Organization.find(1)
|
||||||
|
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)
|
||||||
|
crypted_str = Base64.decode64(base64_safe(auth))
|
||||||
|
pkey = OpenSSL::PKey::RSA.new(File.new(File.join(Rails.root,"config/private.key")))
|
||||||
|
content = pkey.private_decrypt(crypted_str,OpenSSL::PKey::RSA::PKCS1_PADDING)
|
||||||
|
# content = pkey.private_decrypt(crypted_str)
|
||||||
|
ActiveSupport::JSON.decode(content)
|
||||||
|
end
|
||||||
|
|
||||||
|
def login(opt)
|
||||||
|
sso = Sso.sync_user(opt)
|
||||||
|
start_user_session(sso.user)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -1,4 +1,56 @@
|
|||||||
class Sso < ActiveRecord::Base
|
class Sso < ActiveRecord::Base
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
attr_accessible :email, :name, :openid, :password, :school, :sex
|
attr_accessible :email, :name, :openid, :password, :school, :sex, :user, :user_id
|
||||||
|
|
||||||
|
validates :user_id, :user, :email, :openid, :presence => true
|
||||||
|
|
||||||
|
def self.sync_user(opt)
|
||||||
|
sso = Sso.where(openid: opt["openid"]).first
|
||||||
|
return sso if sso
|
||||||
|
|
||||||
|
sso = Sso.new
|
||||||
|
sso.name = opt["name"]
|
||||||
|
sso.openid = opt["openid"]
|
||||||
|
sso.email = opt["email"]
|
||||||
|
sso.password = opt["password"]
|
||||||
|
sso.school = opt["school"]
|
||||||
|
sso.sex = opt["sex"]
|
||||||
|
|
||||||
|
|
||||||
|
# 查邮箱
|
||||||
|
user = User.where(mail: opt["email"]).first
|
||||||
|
|
||||||
|
unless user
|
||||||
|
# 查用户名
|
||||||
|
|
||||||
|
user = User.where(login: opt["name"]).first
|
||||||
|
if user
|
||||||
|
# 跳到修改用户名
|
||||||
|
raise "exist user"
|
||||||
|
end
|
||||||
|
|
||||||
|
password = opt["password"]
|
||||||
|
if password.size < 8
|
||||||
|
password = random_pwd
|
||||||
|
end
|
||||||
|
us = UsersService.new
|
||||||
|
user = us.register(login: opt["name"], mail: opt["email"],
|
||||||
|
password: password,
|
||||||
|
:should_confirmation_password => false)
|
||||||
|
if user.new_record?
|
||||||
|
raise user.errors.full_messages.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sso.user = user
|
||||||
|
sso.save!
|
||||||
|
return sso
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
|
def self.random_pwd
|
||||||
|
('a'..'z').to_a.shuffle[0..7].join
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in new issue