Можно ли сделать кросс-серверную сессию с помощью gorilla / sessions? Предположим, у меня есть несколько серверов для обслуживания одного веб-сайта. Если пользователь входит в систему на одном сервере, я ожидаю, что он также войдет в систему на другом сервере.
@CasperHK Это то, что вы получаете по умолчанию с файлами cookie: если все серверы являются частью одного домена (например, github.com или * .github.com), cookie будет отправлен браузером.
В качестве альтернативы сеансы также поддерживают хранилища на стороне сервера - все серверы должны иметь возможность подключаться к этому хранилищу (будь то Redis, PostgreSQL и т. Д.).
gorilla/session
отлично подходит для моей задачи. На самом деле, я хочу использовать Go в своем проекте последнего года обучения в университете, и теперь у меня есть 12 серверов ubuntu в одном домене. Некоторые из них будут использоваться как веб-серверы, а один - как сервер базы данных MySQL. Поэтому я хочу реализовать службу сеансов на основе MySQL, чтобы разрешить синхронизацию данных сеанса на всех веб-серверах.
Раньше я пытался запрограммировать кросс-серверный сеанс на базе MySQL. Если srinathgs/mysqlstore
предоставляет более простой способ сделать то же самое, для меня будет здорово изучить и упростить свою работу.
Используйте CookieStore по умолчанию, и если все серверы имеют одинаковый ключ подписи,
и существовать в том же домене, он будет работать как есть.
Вс, 24 июля 2016 г., в 22:48 Casper LI [email protected] написал:
gorilla / session отлично подходит для моей задачи. На самом деле я хочу использовать Go на моем
последний год в моем университете, и теперь у меня есть 12 серверов Ubuntu под
тот же домен. Некоторые из них будут использоваться в качестве веб-серверов, а один будет
используется как сервер базы данных MySQL. Поэтому я хочу реализовать
Служба сеансов на основе MySQL, позволяющая синхронизировать данные сеанса во всей сети
серверы.
Раньше я пытался запрограммировать кросс-серверный сеанс на базе MySQL. Если "
github.com/gorilla/sessions "предоставляет более простой способ сделать то же самое, это
отлично подходит для изучения и упрощения моей работы.-
Вы получаете это, потому что вас назначили.Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/gorilla/sessions/issues/87#issuecomment -234845955,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AABIcNfC7H8DrZq5NX1Tu7W_Vd1LM5BIks5qZE43gaJpZM4JTizF
.
Извините, я хочу спросить, что такое CookieStore по умолчанию и ключ подписи? CookieStore означает пакет gorilla/sessions
?
да. Взгляните на http://www.gorillatoolkit.org/pkg/sessions -
something-very-secret
- ключ подписиsessions.NewCookieStore
возвращает *CookieStore
, что не требует наличия базы данных / общего состояния между вашими серверами.import (
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("something-very-secret"))
func MyHandler(w http.ResponseWriter, r *http.Request) {
// Get a session. We're ignoring the error resulted from decoding an
// existing session: Get() always returns a session, even if empty.
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// Set some session values.
session.Values["foo"] = "bar"
session.Values[42] = 43
// Save it before we write to the response/return from the handler.
session.Save(r, w)
}
Я прочитал код. Когда я смотрю на
var store = sessions.NewCookieStore([]byte("something-very-secret"))
Интересно, используется ли переменная store
во всех обработчиках проекта. Если это так, мне кажется, что мне нужно обернуть его в другой пакет и экспортировать. Это связано с тем, что я разделил все разные обработчики в разных пакетах в зависимости от того, какую страницу они обслуживают (например, index
, projbrwsr
, codeeditor
), и эти обработчики должны вызывать тот же Store
.
something-very-secret
считается секретным ключом, но я понятия не имею, что мне передать функции NewCookieStore()
.
Внедрить store (sessions.Store) как зависимость в другие ваши пакеты.
В понедельник, 25 июля 2016 г., в 8:57 Casper LI [email protected] написал:
Я прочитал код. Когда я смотрю на
var store = sessions.NewCookieStore ([] byte ("что-то очень-секретное"))
Интересно, используется ли переменная store во всех обработчиках
проект. Если да, то мне кажется, что мне нужно обернуть его в другой пакет и
сделать его экспортированным. Это потому, что я разделил все разные обработчики в
разные пакеты в зависимости от того, какую страницу они обслуживают (например, index,
projbrwsr, codeeditor) и эти обработчики должны вызывать один и тот же Store.
[image: image]
https://cloud.githubusercontent.com/assets/6957401/17107410/a34dcc50-52c1-11e6-92f7-a4227da60244.png-
Вы получаете это, потому что вас назначили.Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/gorilla/sessions/issues/87#issuecomment -234996994,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AABIcOHzeq8IabUoj-SZx_B-7er-PJf9ks5qZNzsgaJpZM4JTizF
.
что-то-очень-секретное называется секретным ключом, но я понятия не имею, что мне передать функции NewCookieStore ().
https://godoc.org/github.com/gorilla/sessions#NewCookieStore
Ключи определяются парами, чтобы разрешить ротацию ключей, но обычно задают один ключ аутентификации и, при необходимости, ключ шифрования.
Первый ключ в паре используется для аутентификации, а второй - для шифрования. Ключ шифрования может быть равен нулю или опущен в последней паре, но ключ аутентификации требуется во всех парах.
NewCookieStore
принимает ключ аутентификации / подписи и (необязательный) ключ шифрования.
Извините, я новичок в Go. Не могли бы вы подробнее рассказать о Inject store
или дать мне ссылку для объяснения? Спасибо.
@CasperHK Заставьте конструкторы ваших пакетов принять свои зависимости - например,
NewProjectBrowser(store sessions.Store, debug bool) (*ProjectBrowser, error) { ... }
NewCodeEditor(store sessions.Store) (*CodeEditor, error) { ... }
В main.go
func main() {
// Create a store, and then pass it (inject it) into your other packages via their constructors
store := sessions.NewCookieStore(key)
...
ce, err := package.NewCodeEditor(store)
...
pb, err := package.NewProjectBrowser(store)
...
}
Закрытие из-за бездействия.
Самый полезный комментарий
@CasperHK Это то, что вы получаете по умолчанию с файлами cookie: если все серверы являются частью одного домена (например, github.com или * .github.com), cookie будет отправлен браузером.
В качестве альтернативы сеансы также поддерживают хранилища на стороне сервера - все серверы должны иметь возможность подключаться к этому хранилищу (будь то Redis, PostgreSQL и т. Д.).