Рэйкі Распрацоўваюць + Распрацоўваюць-bascamper Як дазволіць супер карыстачу увайсці ў любы ўліковага запісу?

Я выкарыстоўваю распрацаваць і распрацаваць-basecamper для праверкі сапраўднасці з маёй подобластей на аснове вэб-прыкладанні.

Я хацеў бы, каб супер-карыстальнікам доступ да любой з рахункаў (у асноўным любой подобластей).

Я не ведаю, як я б ісці аб рэалізацыі гэтага, так што карыстальнік можа прайсці праверку сапраўднасці ў любой подобластей, так як карыстальнік у цяперашні час спраўджваюцца пэўнага субдомен.

Любыя ідэі?

4

6 адказы

Калі я правільна зразумеў вашыя патрэбы, Зб падыход павінен выканаць наступныя дзеянні:

  • як адміністратар зможа «стаць» іншага карыстальніка, для таго, каб доступ да гэтага з дадаткам, як калі б вы выкарыстоўвалі яго ўліковыя дадзеныя для ўваходу ў сістэму
  • Пасля таго, як «стаць» гэты наведвальнік вы хочаце, каб мець магчымасць «стаць» ваш рэальны карыстальнік зноў кожны раз, калі вы хочаце без неабходнасці ўваходу ў ад'ездзе і ўвайдзіце зноў.
  • Захоўвайце вашы правы адміністратара ў той час як вы сталі іншым карыстальнікам (гл ніжняй частцы адказу на гэта)
  • Пазбягайце часопісы кажучы ўжо дзеянне было выканаць наведвальнік вы «сталі»

<�Моцны> Стаць карыстальнікам

Гэта неабходна, калі вам неабходна выканаць дзеянні, як іншы карыстальнік, або «бачыць тое, што ён бачыць»

Перш за ўсё, неабходна ажыццявіць афіцыйны шлях у DEViSE (гэта з'яўляецца <�моцны> псевдокод , я дазволю вам адаптаваць яго да вашай асабістай сітуацыі)

# the usage of session[:original_user_id] is explained later
def become
  if admin? or session[:original_user_id]

    if session[:original_user_id] == params[:id]
      session[:original_user_id] = nil # This is intended to clean-up stuff after you become your self back again
    else
      session[:original_user_id] = current_user.id # This is to record your real identity while you are becoming some one else
    end

    sign_in(:user, User.find(params[:id]))
  end
end

Як вы бачыце, мы «стаць» запытаны карыстальнікам, плюс мы запісваем у сесіі ваш рэальны user.id . Звярніце ўвагу, што калі вы выбіраеце гэта рашэнне вы павінны ўсталяваць уверх рэйкі, каб захаваць дадзеныя сесіі ў базе дадзеных, каб пазбегнуць пазбегнуць неабходнасці гэтых дадзеных блукаць у дзікім печыва.

<�Моцны> Як стаць вашай уласнай асобы зноў

Па-другое вам трэба дзе-то на ваш погляд, спасылка на «стаць назад вашай уласнай асобы», я прапаную загаловак у добрым месцы

if session[:original_user_id]
  link_to 'Be my self', become_path(session[:original_user_id])
end

Гэта дазволіць стварыць спасылку, бачны толькі для адміністратара, які «стаў» нехта яшчэ, і спасылка дазволіць «стаць» карыстальнікам з ідэнтыфікатарам, які адпавядае вашай рэальнай ўліковага запісу карыстальніка. Пры націску на яе будзе вярнуць вашу сапраўдную асобу.

Keep your admin privileges while you became another user

Затым вы хочаце, каб трымаць вас правамі адміністратара, нам трэба, каб падмануць сістэму, каб прымусіць яго паверыць, што наведвальнік вы «сталі» з'яўляецца адміністратарам, але мы павінны абараніць прыкладанне, так што не будзе рабіць непажаданымі захаваць гэтага «падробленыя прывілеі» ў базе дадзеных

У кантролеры прыкладання, ажыццяўляць перад фільтрам

before_filter :fake_admin

def fake_admin
  if session[:original_user_id]
    current_user.fake_admin = true
    current_user.admin = true
  end
end

Затым, каб абараніць вас запіс карыстальніка, каб атрымаць непажаданую адміністратара прывілеяў, у вашай карыстацкай мадэлі вы можаце ўсталяваць before_save_filter (або before_validation_filter, у залежнасці ад архітэктуры)

before_save :check_for_fake_admin

def check_for_fake_admin
  self.admin = false if self.fake_admin
end

Пазбягайце часопісы, каб паказаць імя карыстальніка, якога вы сталі

У вас няма выбару, акрамя як уручную ўзламаць усе месцы ў дадатку, дзе дзеянне неабходна ўказаць імя адміністратара замест карыстальніка, «стаў» імем "s. Axample ў запісах updated_by павінен быць усталяваны ў становішча сесіі [: original_user_id] калі гэта не нуль

Цяпер, калі гэта неабходна не толькі ў часопісах, але і для любой іншай рэчы. Гэта ўсё залежыць ад вашага прыкладання, і гэта можа стаць вельмі стомным для падтрымання.

<�Моцны> Юрыдычная інфармацыя

  • Гэта псевдокод, небяспечны, і калі вы выбіраеце гэтае рашэнне, вы павінны былі б для забеспячэння бяспекі
  • Я адказваю на ваша пытанне, таму што вы прасілі, але мой асабісты кавалак раяць: не выкарыстоўваць гэтае рашэнне, таму што гэта выглядае як вялікая дзірка ў бяспецы, і вы павінны дазволіць адміністратара карыстачу увайсці-аўт і ўваходу ў сістэму пасля таго, як яны становяцца хтосьці
9
дададзена
Я толькі прачытаў сваю першую кропку кулі, але неразуменне (ці я няправільна тлумачыць). Я хачу, каб мець магчымасць увайсці ў любую уліковы запіс (любой подобластей) з маім 1 і толькі аднаго адміністратара карыстальніка. Я хачу зрабіць што-то і ёсць мае часопісы паказваюць, што я іх (не зарэгістраваць іх у якасці іншага карыстальніка).
дададзена аўтар Catfish, крыніца
Ваша тэхніка, верагодна, будзе працаваць, але я не хачу, каб выдаваць сябе за іншага карыстальніка. Я проста хачу, каб выкарыстоўваць адзін карыстальнік, што я ёсць, і ўвайсці ў любой ўліковага запісу з ім.
дададзена аўтар Catfish, крыніца
Вы знаёмыя з кодам <> вынайсці-basecamper ? Вось што я выкарыстоўваю.
дададзена аўтар Catfish, крыніца
Я не граміць свой адказ, я проста падумаў, што адразу ж вы не разумееце, што я шукаю. Я не хачу, каб стаць іншым карыстальнікам. Я хачу, каб быць маім карыстальнікам і мець магчымасць увайсці ў рахунак Джэфа. Я таксама хачу, каб быць маім карыстачу і быць у стане увайсці ў член, Гары, і рахункі Larry, а таксама, але так як яны маюць розныя поддомены я не магу, таму што ў маёй табліцы карыстальнікаў, мой карыстальнік звязаны з 1 ўліковага запісу.
дададзена аўтар Catfish, крыніца
Уточнитните «ўвайсці ў рахунак Джэфа». Без якіх-небудзь дэталяў, што я разумею, гэта «стаць Джэфам» з пункту гледжання прымянення.
дададзена аўтар Benj, крыніца
Цяпер я :) Але я павінен быць што-то не хапае, таму што я да гэтага часу не разумею, як мой метад не можа прымяняцца.
дададзена аўтар Benj, крыніца
Акрамя таго, калі вы хочаце, каб дзейнічаць як «Джэф» Вы павінны быць «Джэф», так што ваш current_user павінен быць «Джэф». Вядома ж усё ваша прыкладанне будзе бачыць Вас у якасці «Джэфа», таму бярвёны згаданы «Джэф», а не «адміністратар», для таго і іншыя нязручныя рэчы вам трэба ўзламаць ўручную (праверку пераменнага сеансу, напрыклад). Вы не глядзіце на цяжкае і ускладненае вырашэнні
дададзена аўтар Benj, крыніца
Чытаць далей, вы не можаце пстрыкнуць пальцамі і стаць іншым карыстальнікам, захоўваючы пры гэтым свае правы адміністратара, неабходна ўсю сістэму налады, а частка яго, каб мець магчымасць змяніць кошт, гэта значыць тое, што я растлумачу вам. Ваша справа складаная, таму мой адказ доўга, але яго поўны. Я выдаткаваў час, каб напісаць гэта, быць добрымі і выдаткаваць трохі часу, каб прачытаць яго, то вы можаце граміць яго, калі вам не падабаецца :) Вітаньні і ўдачы
дададзена аўтар Benj, крыніца

Я выкарыстоўваю наступнае рашэнне ў маіх праграмах.

class RandomController < ApplicationController
  before_filter :authenticate_user!, unless: :super_user
end

class ApplicationController < ActionController::Base
  def super_user?
    current_user.email == '[email protected]'
  end
end
3
дададзена
Дзе вы вызначаеце метад SUPER_USER?
дададзена аўтар Catfish, крыніца
Гэта не працуе. Як SUPER_USER? Атрымаць current_user.email , калі карыстальнік не прайшоў праверку сапраўднасці? Калі карыстальнік не прайшоў праверку сапраўднасці, няма current_user.
дададзена аўтар Catfish, крыніца
Я проста паспрабаваў гэта зноў, і гэта не працуе. Ваша рашэнне не прымаць пад увагу, што карыстальнік прывязаны да пэўнай подобластей.
дададзена аўтар Catfish, крыніца
@Catfish Абноўлены адказ :)
дададзена аўтар CharlesJHardy, крыніца
@Catfish бачыць маё рэдагаванне - гэта будзе працаваць. Калі карыстальнік не прайшоў праверку сапраўднасці для гэтага спатрэбіцца Увайсці, калі будзе падпісаны ў і супер карыстальнік будзе ўпусціць яго.
дададзена аўтар Mike Szyndel, крыніца

Аўтэнтыфікацыя і аўтарызацыя два розных дзеянні, і я прытрымліваюся думкі, што гэта павінна быць зроблена асобна. Выкарыстоўвайце метад DEViSE для аўтэнтыфікацыі і рэалізаваць свой уласны код для аўтарызацыі.

<�Моцны> Прыклад: </моцны>

class SomeController < ApplicationController
  before_filter :authenticate_user!
  before_filter :authorize_user

end

class ApplicationController < ActionController::Base
  def authorize_user
    unless current_user.admin? or request.subdomain == current_user.subdomain# logic to check if user is authorized
      redirect_to root_path, :notice => "Access denied"
    end
  end
end
1
дададзена
Я ведаю, што, але я не магу выкарыстоўваць адзін і той жа карыстальнік больш за 1 ўліковага запісу Beacause завяшчанні не дазваляе ствараць карыстальнікаў з паўтаральнымі лістоў.
дададзена аўтар Catfish, крыніца
Гэта не дазволіць мне ўвайсці ў любой іншай ўліковага запісу, выдатнай ад ўліковага запісу, што маё імя звязана з. Мне трэба, каб мець магчымасць увайсці ў любую уліковы запіс, але я не магу стварыць імя карыстальніка для кожнай ўліковага запісу, як вы не можаце мець дублікаты лістоў з завяшчанні. Сэнс?
дададзена аўтар Catfish, крыніца
Вам не трэба ствараць асобныя уліковыя запісы. Любы карыстальнік, для якога current_user.admin вяртае True будзе дазволены.
дададзена аўтар Santhosh, крыніца

Дакументацыя Распрацоўваюць мае раздзел як: Увайсці як іншы карыстальнік, калі вы з'яўляецеся адміністратарам , які тлумачыць, як дамагчыся таго, што вы спрабуеце зрабіць.

Гэта сутнасць таго, што дакументацыя кажа, што вам трэба зрабіць:

class AdminController < ApplicationController
  before_filter authenticate_user!

  def become
    return unless current_user.is_an_admin?
    sign_in(:user, User.find(params[:id]))
    redirect_to root_url # or user_root_url
  end
end
1
дададзена
Я не спрабую увайсці ў сістэму як іншы карыстальнік, я спрабую дазволіць карыстальніку адміністратару увайсці ў любы ўліковага запісу.
дададзена аўтар Catfish, крыніца
Мяркуючы па назве і кодзе, ён падпісвае карыстальнік ў якасці іншага карыстальніка, а не дазваляе аднаму карыстачу мець доступ да любой ўліковага запісу. Напрыклад, калі я карыстач «адміністратар» і ёсць карыстач «Джэф» звязаны з ўліковага запісу «А», я хачу, каб мець магчымасць увайсці ў свой рахунак «А», як карыстальнік «адміністратар», але спасылка і код, які вам размешчана дазволіць карыстальніку «адміністратара», каб увайсці як карыстальнік «джэфам». Я хачу, каб захаваць адрозненне, так што «адміністратар» не можа зрабіць што-то і часопісы паказваюць, што «Джэф» зрабіў гэта. Калі ласка, папраўце мяне, калі я непаразуменне код.
дададзена аўтар Catfish, крыніца
Гэта тое, што частка дакументацыі, якую я звязаны з тлумачу, як гэта зрабіць ... гэта за тое, што карыстальнік з правамі адміністратара, каб увайсці ў любую уліковы запіс.
дададзена аўтар Michael Frederick, крыніца

У рэшце рэшт мне давялося выдаліць унікальны індэкс электроннай пошты з табліцы карыстальнікаў, якія вынайсці стварае па змаўчанні, і дадаць новы ўнікальны індэкс па табліцы карыстальнікаў як з электроннай пошты і account_id калоны. Гэта дазволіць мне стварыць карыстальнік (які я тэлефаную [email protected]) для кожнай ўліковага запісу, якая ствараецца.

Вось мая міграцыя

def change
  remove_index :users, :email
  add_index :users, [:email, :account_id], :unique => true
end

Вось мой after_save зваротны выклік, які я дадаў да майго <�рахунку/код> мадэлі.

class Account < ActiveRecord::Base

  after_save :create_support_user

  private 

  # A callback that creates a support user after an account is created.
  def create_support_user   

    user = User.new
    user.email = "[email protected]"
    user.password = "test1234"
    user.password_confirmation = "test1234"
    user.account_id = self.id
    user.name = "Support"
    user.skip_confirmation!
    user.admin = true
    user.save

  end
end
0
дададзена

Я думаю, вы павінны падзяліць аўтарызацыю і аўтэнтыфікацыю. Аўтэнтыфікацыя правярае, калі пэўны Лагін кошт сапраўдны, аўтарызацыя прысвойвае набор рэсурсаў для карыстальніка.

Калі ў мяне ёсць агульныя дазволу, вы можаце проста зрабіць метад у ApplicationController, які вяртае (Фільтраваныя) рэсурс, калі карыстальнік мае доступ да яго. Ці вы можаце, напрыклад, дадаць вобласць для кожнай актыўнай запісу мадэлі, SCOPES па user_id, калі карыстальнік мае толькі правы, каб бачыць свае ўласныя рэсурсы.

0
дададзена
Усе дазволы ў бок, я не магу ўвайсці на іншы рахунак. Я выкарыстоўваю вынайсці-basecamper .
дададзена аўтар Catfish, крыніца