Merge branch 'develop' of https://git.trustie.net/jacknudt/trustieforge into develop
commit
6e7d20c410
@ -0,0 +1,71 @@
|
||||
#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.new(:user_id => sso.user_id)
|
||||
@organization.org_members << member
|
||||
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)
|
||||
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)
|
||||
sso
|
||||
end
|
||||
|
||||
end
|
@ -0,0 +1,56 @@
|
||||
class Sso < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
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
|
@ -0,0 +1,15 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
|
||||
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
|
||||
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
|
||||
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
|
||||
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
|
||||
ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
|
||||
3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
|
||||
deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
|
||||
qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
|
||||
oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
|
||||
4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
|
||||
QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
|
||||
yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
|
||||
-----END RSA PRIVATE KEY-----
|
@ -0,0 +1,16 @@
|
||||
class CreateSsos < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :ssos do |t|
|
||||
t.references :user
|
||||
t.string :openid
|
||||
t.string :name
|
||||
t.string :password
|
||||
t.string :email
|
||||
t.integer :sex
|
||||
t.string :school
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
add_index :ssos, :user_id
|
||||
end
|
||||
end
|
Loading…
Reference in new issue