Gopress, um blog em Golang (parte 8)
Olá a todos! Continuamos com nossa série sobre como construir um blog usando Golang, a linguagem de programação criada pela Google que está se tornando cada vez mais popular. Se você perdeu as partes anteriores, convido você a ir aos nossos artigos anteriores e se atualizar. Hoje, na oitava parte da nossa série, vamos nos concentrar na autenticação e segurança. Vamos começar!
Checkboxes
Autenticação e segurança
Até agora, criamos nosso blog, Gopress, com funcionalidades básicas, mas ainda não implementamos nenhum mecanismo de autenticação. Não queremos que qualquer pessoa possa publicar, editar ou excluir conteúdo em nosso blog. Para evitar isso, precisamos implementar um sistema de autenticação.
Em Golang, existem várias bibliotecas disponíveis para nos ajudar com a autenticação, mas para este tutorial, usaremos "gorilla/sessions" para gerenciar as sessões do usuário e "golang.org/x/crypto/bcrypt" para o hash de senhas.
Implementando Sessões com Gorilla/Sessions
Para começar, precisamos instalar o pacote Gorilla Sessions. Se você está usando go modules, pode fazer isso com o seguinte comando:
bashCopy codego get github.com/gorilla/sessions
Primeiro, vamos definir uma variável global para nosso armazenamento de sessões:
goCopy codevar (
key = []byte("super-secret-key")
store = sessions.NewCookieStore(key)
)
Feito isso, podemos implementar uma função para definir uma sessão após um login bem-sucedido:
goCopy codefunc setSession(userName string, w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "cookie-name")
session.Values["authenticated"] = true
session.Values["username"] = userName
session.Save(r, w)
}
E outra função para verificar se um usuário está autenticado:
goCopy codefunc checkSession(r *http.Request) bool {
session, _ := store.Get(r, "cookie-name")
if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
return false
}
return true
}
Hash de senhas com bcrypt
Agora, vamos lidar com as senhas de forma segura com bcrypt. Você pode obter bcrypt com o seguinte comando:
bashCopy codego get golang.org/x/crypto/bcrypt
Quando um usuário se registra ou altera sua senha, devemos garantir que não armazenamos a senha em texto simples. Em vez disso, armazenaremos um hash da senha. Aqui está a função para gerar o hash da senha:
goCopy codefunc hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
E quando um usuário faz login, podemos verificar a senha inserida com o hash armazenado:
goCopy codefunc checkPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
E isso é tudo por hoje! Agora você tem as ferramentas para implementar a autenticação no seu blog Gopress. No próximo post, focaremos no gerenciamento de papéis e permissões para os usuários. Como sempre, se você tiver alguma dúvida ou problema, não hesite em deixar um comentário.
Gerenciamento de papéis e permissões
Agora que temos autenticação, podemos querer implementar papéis e permissões. Por exemplo, talvez queiramos um papel de "editor" que possa revisar e aprovar publicações antes de serem publicadas, e um papel de "autor" que possa escrever e editar suas próprias publicações, mas não as de outros.
Para implementar isso, primeiro devemos estender nosso modelo de usuário para incluir um campo de papel:
goCopy codetype User struct {
ID int
Username string
Password string
Role string
}
Em seguida, podemos verificar o papel de um usuário durante a autenticação. Aqui está uma função de exemplo que verifica se um usuário é um editor:
goCopy codefunc checkRole(r *http.Request) string {
session, _ := store.Get(r, "cookie-name")
role := session.Values["role"].(string)
return role
}
Podemos usar essa função em nossos controladores para restringir o acesso a certas funções com base no papel do usuário. Por exemplo:
goCopy codefunc editPostHandler(w http.ResponseWriter, r *http.Request) {
if !checkSession(r) {
http.Redirect(w, r, "/login", 302)
return
}
if checkRole(r) != "editor" {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
// ... código para editar a publicação ...
}
Neste código, redirecionamos usuários não autenticados para a página de login. Se o usuário está autenticado mas não é um editor, retornamos um erro 403 Forbidden. Apenas editores podem acessar a funcionalidade de edição de publicações.
Esperamos que este artigo tenha sido útil para você entender como implementar autenticação e papéis no seu blog Gopress. No próximo post, exploraremos como implementar uma funcionalidade de busca no blog. Até a próxima!
Comentarios