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