2017-02-08 13 views
0

Active Directory認証を使用してWebアプリケーションを構築しようとしています。私はまた、ユーザーの電子メールアドレスを取得する必要があります。私は電子メールアドレスを取得できる機能を持っています。 mainHandler()で電子メールを取得するために、関数をどこでどのように使うべきですか?golang webapp with LDAP

type Handler func(w http.ResponseWriter, r *http.Request) 

// BasicAuth - handler wrapper for authentication 
func BasicAuth(pass Handler) Handler { 

    return func(w http.ResponseWriter, r *http.Request) { 
     username, password, ok := r.BasicAuth() 
     err := ValidateAD(username, password) 
     if err != nil || !ok { 
      realm := "Please enter your corporate key and password" 
      w.Header().Set("WWW-Authenticate", `Basic realm="`+realm+`"`) 
      // w.WriteHeader(401) 
      http.Error(w, "authorization failed", http.StatusUnauthorized) 
      return 
     } 
     pass(w, r) 
    } 
} 

var ErrEmptyUserOrPass = errors.New("Username or password cannot be empty") 
var conn *ldap.Conn 


// ValidateAD validation based on Active Directory 
func ValidateAD(user, passwd string) error { 
    if user == "" || passwd == "" { 
     return ErrEmptyUserOrPass 
    } 
    tlsConfig := &tls.Config{InsecureSkipVerify: true} 
    var err error 
    conn, err = ldap.DialTLS("tcp", "ad.something.com:636", tlsConfig) 
    if err != nil { 
     return err 
    } 
    defer conn.Close() 
    domainPrefix := "ad\\" 
    err = conn.Bind(domainPrefix+user, passwd) 
    if err != nil { 
     return err 
    } 
    return nil 
} 

// GetLDAPEmail returns email address for given username and password 
func GetLDAPEmail(user, password string) (string, error) { 
    if err := ValidateAD(user, password); err != nil { 
     return "", err 
    } 
    searchBase := "CN=" + user + ",OU=OU1,OU=OU2,OU=OU3,DC=ad,DC=something,DC=com" 
    searchFilter := "(&(samAccountName=" + user + "))" 
    searchRequest := ldap.NewSearchRequest(
     searchBase, // The base dn to search 
     ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, 
     searchFilter,  // The filter to apply 
     []string{"mail"}, // A list attributes to retrieve 
     nil, 
    ) 
    sr, err := conn.Search(searchRequest) 
    if err != nil { 
     return "", err 
    } 
    email := sr.Entries[0].GetAttributeValue("mail") 
    return strings.ToLower(email), nil 
} 
+0

ユーザー名とパスワードを送信すると 'mainHandler'で' GetLDAPEmail'を呼び出すことができます –

+0

GetLDAPEmail()に渡すためのユーザー名とパスワードを取得するにはどうすればよいですか? – user2357858

答えて

0

auth.go

main.go

func main() { 
    http.HandleFunc("/", auth.BasicAuth(mainHandler)) 
    http.ListenAndServe(":8080", nil) 
} 

func mainHandler(w http.ResponseWriter, r *http.Request) { 
    tmpl, err := template.ParseFiles("templates/main.html") 
    if err == nil { 
     tmpl.Execute(w, nil) 
    } 
} 

あなたの機能とハンドラが配線されている方法で、私は戻ってからの状態を渡すために、「クリーン」オプションの全体の多くが表示されませんリクエストごとにBasicAuth()mainHandler()

あなたはセットアップあなたのハンドラを方法を変更するという考えに開いている場合は、ここでは、あなたのニーズに合わせて拡張することができ骨格構造である:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

type User struct { 
    Name  string 
    Password string 
} 

func main() { 
    mux := http.NewServeMux() 
    mux.Handle("/", &User{}) 
    s := &http.Server{Addr: "localhost:8080", Handler: mux} 
    log.Fatal(s.ListenAndServe()) 
} 

func (u *User) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    //Pull out the username and password 
    u.BasicAuth() 
    fmt.Println(u.Name) 
    fmt.Println(u.Password) 
    //The rest of your main handler 
} 

func (u *User) BasicAuth() { 
    //This is to demonstrate the ability to pass state 
    //Edit this to fit your needs 
    u.Name = "user" 
    u.Password = "pass" 
} 

User構造体が効果的に、ServeHTTP機能を実装http.Handlerinterfaceを実装してマルチプレクサに追加するオプションを開き、要求ごとにユーザ名とパスワードを維持するのに役立ちます。これらのメソッドはポインタ型を受け取りますが、必要に応じて変更することができます。

+0

ありがとうございます。今日私はr.Header ["Authorization"]から認証データを取得できることを発見しました:) – user2357858