1616package controller
1717
1818import (
19+ "crypto/rand"
20+ "crypto/rsa"
21+ "crypto/x509"
1922 "encoding/base64"
2023 "encoding/json"
24+ "encoding/pem"
2125 "errors"
26+ "fmt"
2227 "github.com/go-ldap/ldap/v3"
2328 "github.com/go-openapi/runtime"
2429 "github.com/go-openapi/runtime/middleware"
30+ "github.com/spf13/viper"
2531 "mlss-controlcenter-go/pkg/common"
2632 "mlss-controlcenter-go/pkg/logger"
2733 "mlss-controlcenter-go/pkg/models"
@@ -32,6 +38,11 @@ import (
3238 "strings"
3339)
3440
41+ const (
42+ ldapPubKey = "ldapPubKey"
43+ ldapPrivKey = "ldapPrivKey"
44+ )
45+
3546func UMLogin (params logins.UMLoginParams ) middleware.Responder {
3647 username := params .Username
3748 password := params .Password
@@ -93,13 +104,34 @@ func UMLogin(params logins.UMLoginParams) middleware.Responder {
93104
94105func LDAPLogin (params logins.LDAPLoginParams ) middleware.Responder {
95106 username := params .LoginRequest .Username
96- password := params .LoginRequest .Password
107+ decodeBytes , err := base64 .StdEncoding .DecodeString (params .LoginRequest .Password )
108+ if err != nil {
109+ logger .Logger ().Error ("failed to login, base64 decode failed:%v" , err .Error ())
110+ return ResponderFunc (http .StatusInternalServerError , "failed to login, base64 decode failed:" , err .Error ())
111+ }
112+ decryptPassword , err := RsaDecrypt (decodeBytes )
113+ if err != nil {
114+ logger .Logger ().Error ("failed to login, rsa decrypt failed:%v" , err .Error ())
115+ return ResponderFunc (http .StatusInternalServerError , "failed to login, rsa decrypt failed:" , err .Error ())
116+ }
97117
98- isAccess , err := LDAPAuth (username , password )
99- if err != nil || isAccess == false {
118+ isAccess := false
119+ if username == common .GetAppConfig ().Application .Admin .User {
120+ if string (decryptPassword ) == common .GetAppConfig ().Application .Admin .Password {
121+ isAccess = true
122+ }
123+ } else {
124+ isAccess , err = LDAPAuth (username , string (decryptPassword ))
125+ if err != nil {
126+ logger .Logger ().Error ("Failed to login, LDAP Auth Error:" , err .Error ())
127+ return ResponderFunc (http .StatusBadRequest , "Failed to login, LDAP auth failed:" , err .Error ())
128+ }
129+ }
130+ if isAccess == false {
100131 return ResponderFunc (http .StatusBadRequest , "failed to login" , "failed to login" )
101132 }
102133
134+ // Check system permission
103135 p , err := service .CheckUserPermission (username )
104136 if err != nil {
105137 return ResponderFunc (http .StatusInternalServerError , "failed to login" , err .Error ())
@@ -108,21 +140,20 @@ func LDAPLogin(params logins.LDAPLoginParams) middleware.Responder {
108140 return ResponderFunc (http .StatusUnauthorized , "failed to login, " , "User does not have system permissions" )
109141 }
110142
143+ //Set Session User for Return
144+ isSA := service .GetSAByName (username ).Name == username
111145 sessionUser := models.SessionUser {
112146 UserName : username ,
113- IsSuperadmin : service . GetSAByName ( username ). Name == username ,
147+ IsSuperadmin : isSA ,
114148 }
115-
116149 logger .Logger ().Debugf ("sessionUser: %v" , sessionUser )
117-
118150 marshal , _ := json .Marshal (sessionUser )
119151 var result = models.Result {
120152 Code : "200" ,
121153 Message : "success" ,
122154 Result : json .RawMessage (marshal ),
123155 }
124156
125- //authcache.TokenCache.Set(token, sessionUser, cache.DefaultExpiration)
126157 return middleware .ResponderFunc (func (w http.ResponseWriter , _ runtime.Producer ) {
127158 cookie := service .LDAPLogin (w , common .GetAppConfig ().Core .Cookie .Path , sessionUser )
128159 http .SetCookie (w , & cookie )
@@ -132,29 +163,60 @@ func LDAPLogin(params logins.LDAPLoginParams) middleware.Responder {
132163}
133164
134165func LDAPAuth (username string , password string ) (bool , error ) {
135- l , err := ldap .DialURL (common .GetAppConfig ().Application .LDAP )
166+ address := common .GetAppConfig ().Application .LDAP .Address
167+ baseDN := common .GetAppConfig ().Application .LDAP .BaseDN
168+
169+ //Dial LDAP Server
170+ l , err := ldap .DialURL (address )
136171 if err != nil {
137- logger .Logger ().Errorf ("ldap server dial error" + err .Error ())
172+ logger .Logger ().Errorf ("LDAP Dial Fail:%v" , err .Error ())
138173 return false , err
139174 }
140175 if l == nil {
141- logger .Logger ().Errorf ("ldap server dial error, connection is nil" )
142176 return false , errors .New ("ldap server dial error,connection is nil" )
143177 }
144178
145- passwordDecode , err := base64 .StdEncoding .DecodeString (password )
179+ //Search User in LDAP Server
180+ nsr := ldap .NewSearchRequest (baseDN , ldap .ScopeBaseObject , ldap .NeverDerefAliases ,
181+ 0 , 0 , false ,
182+ fmt .Sprintf ("(&(objectClass=organizationalPerson)(uid=%s))" , username ), []string {"dn" }, nil )
183+ sr , err := l .Search (nsr )
146184 if err != nil {
147- logger .Logger ().Errorf ("Password decode Error" + err .Error ())
185+ logger .Logger ().Errorf ("LDAP Search Fail:%v" ,err .Error ())
186+ return false , err
148187 }
149188
150- _ , err = l .SimpleBind (& ldap.SimpleBindRequest {
151- Username : username ,
152- Password : string (passwordDecode ),
153- })
189+ //Auth User Password
190+ userDN := sr .Entries [0 ].DN
191+ err = l .Bind (userDN , password )
154192 if err != nil {
155- logger .Logger ().Errorf ("LDAP Server Auth Error: %s\n " , err )
156193 return false , err
157194 }
158195 defer l .Close ()
159- return true , err
196+ return true , nil
197+ }
198+
199+ func GetRsaPubKey (params logins.GetRsaPubKeyParams ) middleware.Responder {
200+ return middleware .ResponderFunc (func (w http.ResponseWriter , _ runtime.Producer ) {
201+ var result = models.Result {
202+ Code : "200" ,
203+ Message : "success" ,
204+ Result : viper .GetString (ldapPubKey ),
205+ }
206+ payload , _ := json .Marshal (result )
207+ w .Write (payload )
208+ })
209+ }
210+
211+ func RsaDecrypt (context []byte ) ([]byte , error ) {
212+ privateKey := viper .GetString (ldapPrivKey )
213+ block , _ := pem .Decode ([]byte (privateKey ))
214+ if block == nil {
215+ return nil , errors .New ("private key error" )
216+ }
217+ priv , err := x509 .ParsePKCS1PrivateKey (block .Bytes )
218+ if err != nil {
219+ return nil , err
220+ }
221+ return rsa .DecryptPKCS1v15 (rand .Reader , priv , context )
160222}
0 commit comments