Witam
Jest serwis w którym użytkownicy oprócz dostępu do normalnej domeny (gdzie jest logowanie, część użytkownika itp) mogą definiować swoje subdomeny. W części gdzie są subdomeny nie używane jest logowanie, sa za to cookies i sesja. Jakie jest Wasze podejście do kwestii sesji w tym przypadku ? Domyślnie wiadomo, domena.pl nie bedzie widziec sesji staszek.domena.pl i na odwrót ? Czy da się i czy należy jakoś ustawić domenę dla cookie sesji na .domena.pl ? Jakie są ewentualne zagrożenia ?
Kiedyś korzystałem z takiego kodu:
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.update( :session_domain => '.domena.pl' )
Można też tak w pliku config/environment.rb
Rails::Initializer.run do |config|
config.action_controller.session = {
:domain => '.domena.pl'
}
end
Rozwiązań jest wiele. Głównie powinieneś pomyśleć działać poprzez Rack.
Najprościej,
[code=ruby]class SetCookieDomain
def initialize(app, default_domain)
@app = app
@default_domain = default_domain
end
def call(env)
host = env[“HTTP_HOST”].split(’:’).first
env[“rack.session.options”][:domain] = custom_domain?(host) ? “.#{host}” : “#{@default_domain}”
@app.call(env)
end
def custom_domain?(host)
domain = @default_domain.sub(/^./, ‘’)
host !~ Regexp.new("#{domain}$", Regexp::IGNORECASE)
end
end[/code]
następnie w production.rb
config.middleware.use "SetCookieDomain", ".domena.pl"
a w development.rb
config.middleware.use "SetCookieDomain", ".domena.local"
Ok, no i mamy jakieś podstawy. Pewnie jak dobrze poszukać to wielu coś podobnego i prostego zwinnie potworzyli.
Jeśli jednak chcesz dalej zajść gdy masz rozleglejsze potrzeby, np. dodatkowe drugo poziomowe logowanie bezpieczeństwa w obrębie jednej lub wielu aplikacji. Dokładnie tak, wielu aplikacji, dla usera przeskakującego pomiedzy nimi nie koniecznie tylko w subdomenach jednej ale i na odmiennych domenach. Wtedy przyda ci się zagłebienie w http://github.com/hassox/rails_warden
Temat tez ciekawie i rozlegle był poruszony na http://www.rubyonrails.pl/forum/t2318-Autentykacja-do-kilku-aplikacji-naraz.
Dzięki za kod. Może nie do końca jasno przestawiłem problem. Użytkownicy logują się tylko w części mojserwis.pl. W subdomenach np zenek.domena.pl nie ma możliwości logowania się i każdy może tam zaglądać. Jeśli ktoś jest zalogowany i przechodzi między tymi dwiema częściami to tworzą mu się dwie sesje, jedna dla .mojserwis.pl i druga dla .zenek.domena.pl. Subdomena nie jest dodawana w panelu administracyjnym, tylko poprzez wildcard wszystkie przychodzą do aplikacji i sprawdzane jest czy jakiś użytkownik taką ustawił, to chyba wystarczające rozwiązanie ?
Wracając do session cookie podejrzewam że lepiej jest ustawić jedną sesje dla domeny głównej i subdomen. Czy trzeba do tego używać Rack ? Nie wystarczy ustawić w environment.rb ?
To zależy jakie dokładnie domeny chcesz obsługiwać. Jeśli tylko typu domena.pl i *.domena.pl to spokojnie zrobisz to w environment.rb ustawiając domenę dla cookie “.domena.pl”. Jednak gdy dochodzi jeszcze obsługa custom domeny typu mojserwis.pl to już nie da rady tego tak prosto ustawić (oczywiście zakładając, że wszystko obsługiwane jest przez jedną instancję aplikacji, do której prowadzą wszystkie te domeny).
Wtedy trzeba w Rack Middleware wykryć domenę dla requestu i odpowiednio ustawić domenę dla cookies.
Dokładnie taki przypadek sam kiedyś musiałem oprogramować i zrobiłem to za pomocą wspomnianego tu SetCookieDomain, nawet napisałem na blogu o tym http://codetunes.com/2009/04/17/dynamic-cookie-domains-with-racks-middleware/
@szajbus dzięki za link do bloga. Wiedziałem, że gdzieś to kiedyś wypatrzyłem. No i proszę zostało to dobrze opisane.
Aktualnie rozwiązuję takie sprawy zależnie od potrzeb, głównie poprzez Warden, ale i też CAS czy casrack się sprawdza ale to już bardziej rozwinięte rozwiązanie. Tak czy inaczej zgrabnie i szybko najlepiej poprzez rack’a.
szajbus: czy dzięki temu rozwiązaniu z linka sesją będzie zachowana między różnymi domenami ? Jest przykładowo jedna aplikacja do której jest podpięte kilka domen np cos.ciekawego.pl i coinnego.pl i chciałbym żeby można było zalogować się tylko na jednej z nich i mieć zachowaną sesje przechodząc między nimi
aha, do autentyfikacji używam Authlogica, ale jestem do niego jakoś szczególnie przywiązany
co sądzicie o tym rozwiązaniu http://blog.alec-c4.com/index.php/2009/09/28/sso-на-rails-с-использованием-authlogic/
nie wiem czy zaprzęganie CASa do mojej aplikacji ma sens, ponieważ jest to jedna aplikacja a nie kilka różnych, ale może do niej kierować kilka domen, dlatego szukam czegoś prostszego.