En el proceso de desarrollo de aplicaciones Web, la autenticación del usuario se encuentra con frecuencia problemas de los desarrolladores, registro de usuario en, registro, cierre la sesión y otras operaciones, y la certificación en general también se divide en tres aspectos de la certificación
- HTTP Basic y HTTP Digest autenticación
- Certificado de Integración de Terceros: QQ, micro-blogging, berro, OPENID, Google, GitHub, Facebook y Twitter, etc
- Ingrese usuario personalizada en, registro, cierre la sesión, se basan generalmente en la sesión, la autenticación de cookies
beego No hay manera para cualquiera de estas tres formas de integración, pero se puede hacer uso de la biblioteca de código abierto de terceros para lograr los tres métodos de autenticación de los usuarios anteriores, pero los dos primeros autenticación posterior beego integrarse gradualmente.
Estas dos certificaciones son algunas aplicaciones que utilizan la autenticación relativamente simple, ya hay código abierto biblioteca de terceros compatible con la autenticación::
github.com/abbot/go-http-auth
El código siguiente muestra cómo utilizar esta biblioteca para lograr la introducción de beego Certificación:
package controllers
import (
"github.com/abbot/go-http-auth"
"github.com/astaxie/beego"
)
func Secret(user, realm string) string {
if user == "john" {
// password is "hello"
return "$1$dlPL2MqE$oQmn16q49SqdmhenQuNgs1"
}
return ""
}
type MainController struct {
beego.Controller
}
func (this *MainController) Prepare() {
a := auth.NewBasicAuthenticator("example.com", Secret)
if username := a.CheckAuth(this.Ctx.Request); username == "" {
a.RequireAuth(this.Ctx.ResponseWriter, this.Ctx.Request)
}
}
func (this *MainController) Get() {
this.Data["Username"] = "astaxie"
this.Data["Email"] = "[email protected]"
this.TplNames = "index.tpl"
}
El código anterior se aprovecha de beego la preparación de la función en la función normal de la lógica se llama antes de la certificación, por lo que es muy sencillo de lograr una autenticación HTTP, la autenticación implícita es el mismo principio.
OAuth and OAuth 2 es actualmente dos métodos de autenticación más populares, pero, afortunadamente, hay una biblioteca de terceros para lograr esta certificación, pero se dieron cuenta en el extranjero, y no hicieron QQ, microblogging como integración certificada aplicación interna:
github.com/bradrydzewski/go.auth
El código siguiente muestra cómo poner la biblioteca a fin de lograr la introducción de autenticación OAuth beego, un ejemplo para demostrar GitHub aquí:
-
Añadir dos rutas
beego.RegisterController("/auth/login", &controllers.GithubController{}) beego.RegisterController("/mainpage", &controllers.PageController{})
-
Entonces tratamos la página de destino GithubController:
package controllers import ( "github.com/astaxie/beego" "github.com/bradrydzewski/go.auth" ) const ( githubClientKey = "a0864ea791ce7e7bd0df" githubSecretKey = "a0ec09a647a688a64a28f6190b5a0d2705df56ca" ) type GithubController struct { beego.Controller } func (this *GithubController) Get() { // Establecer los parámetros de autenticación auth.Config.CookieSecret = []byte("7H9xiimk2QdTdYI7rDddfJeV") auth.Config.LoginSuccessRedirect = "/mainpage" auth.Config.CookieSecure = false githubHandler := auth.Github(githubClientKey, githubSecretKey) githubHandler.ServeHTTP(this.Ctx.ResponseWriter, this.Ctx.Request) }
-
tratamiento después de las páginas de destino de éxito
package controllers import ( "github.com/astaxie/beego" "github.com/bradrydzewski/go.auth" "net/http" "net/url" ) type PageController struct { beego.Controller } func (this *PageController) Get() { // Establecer los parámetros de autenticación auth.Config.CookieSecret = []byte("7H9xiimk2QdTdYI7rDddfJeV") auth.Config.LoginSuccessRedirect = "/mainpage" auth.Config.CookieSecure = false user, err := auth.GetUserCookie(this.Ctx.Request) //Si no hay ninguna sesión de usuario activo, entonces autorizar usuario if err != nil || user.Id() == "" { http.Redirect(this.Ctx.ResponseWriter, this.Ctx.Request, auth.Config.LoginRedirect, http.StatusSeeOther) return } //else, agregue el usuario a la URL y continuar this.Ctx.Request.URL.User = url.User(user.Id()) this.Data["pic"] = user.Picture() this.Data["id"] = user.Id() this.Data["name"] = user.Name() this.TplNames = "home.tpl" }
Todo el proceso es el siguiente, primero abra su navegador e ingrese la dirección:
La figura 14.4 muestra la página de inicio con un tronco en el botón
Luego haga clic en el enlace aparece la siguiente pantalla:
Figura 14.5 se muestra después de hacer clic en el registro de autorización botón de página de GitHub
Luego haga clic en Autorizar aplicación aparecerá la siguiente interfaz:
Figure 14.6 is displayed after log in authorization to obtain information page GitHub
Autenticación personalizada y sesiones son generalmente una combinación de probada, el siguiente código de una fuente abierta basada beego blog: //Login process func (this *LoginController) Post() { this.TplNames = "login.tpl" this.Ctx.Request.ParseForm() username := this.Ctx.Request.Form.Get("username") password := this.Ctx.Request.Form.Get("password") md5Password := md5.New() io.WriteString(md5Password, password) buffer := bytes.NewBuffer(nil) fmt.Fprintf(buffer, "%x", md5Password.Sum(nil)) newPass := buffer.String()
now := time.Now().Format("2006-01-02 15:04:05")
userInfo := models.GetUserInfo(username)
if userInfo.Password == newPass {
var users models.User
users.Last_logintime = now
models.UpdateUserInfo(users)
//Establecer la conexión exitosa sesión
sess := globalSessions.SessionStart(this.Ctx.ResponseWriter, this.Ctx.Request)
sess.Set("uid", userInfo.Id)
sess.Set("uname", userInfo.Username)
this.Ctx.Redirect(302, "/")
}
}
//Registration process
func (this *RegController) Post() {
this.TplNames = "reg.tpl"
this.Ctx.Request.ParseForm()
username := this.Ctx.Request.Form.Get("username")
password := this.Ctx.Request.Form.Get("password")
usererr := checkUsername(username)
fmt.Println(usererr)
if usererr == false {
this.Data["UsernameErr"] = "Error de nombre de usuario, por favor, que de nuevo"
return
}
passerr := checkPassword(password)
if passerr == false {
this.Data["PasswordErr"] = "Error de contraseña, favor de nuevo"
return
}
md5Password := md5.New()
io.WriteString(md5Password, password)
buffer := bytes.NewBuffer(nil)
fmt.Fprintf(buffer, "%x", md5Password.Sum(nil))
newPass := buffer.String()
now := time.Now().Format("2006-01-02 15:04:05")
userInfo := models.GetUserInfo(username)
if userInfo.Username == "" {
var users models.User
users.Username = username
users.Password = newPass
users.Created = now
users.Last_logintime = now
models.AddUser(users)
//Establecer la conexión exitosa sesión
sess := globalSessions.SessionStart(this.Ctx.ResponseWriter, this.Ctx.Request)
sess.Set("uid", userInfo.Id)
sess.Set("uname", userInfo.Username)
this.Ctx.Redirect(302, "/")
} else {
this.Data["UsernameErr"] = "User already exists"
}
}
func checkPassword(password string) (b bool) {
if ok, _ := regexp.MatchString("^[a-zA-Z0-9]{4,16}$", password); !ok {
return false
}
return true
}
func checkUsername(username string) (b bool) {
if ok, _ := regexp.MatchString("^[a-zA-Z0-9]{4,16}$", username); !ok {
return false
}
return true
}
Con el registro de usuario en el registro y, donde usted puede agregar otros módulos, como el juicio de si el registro de usuario en:
func (this *AddBlogController) Prepare() {
sess := globalSessions.SessionStart(this.Ctx.ResponseWriter, this.Ctx.Request)
sess_uid := sess.Get("userid")
sess_username := sess.Get("username")
if sess_uid == nil {
this.Ctx.Redirect(302, "/admin/login")
return
}
this.Data["Username"] = sess_username
}
- Directory
- Previous section: Form
- Next section: Multi-language support