flask 개발 중에 다음과 같은 에러를 발견했다.


  File "/Users/samuel.kim/.pyenv/versions/2.7.12/lib/python2.7/site-packages/flask/app.py", line 1051, in add_url_rule

    'existing endpoint function: %s' % endpoint)

AssertionError: View function mapping is overwriting an existing endpoint function: xxx




이 이유는 서로 다른 URL에서 동일한 Controller 클래스를 사용하면 발생한다.


즉, 다음과 같은 형태로 호출되는 것을 의미한다.



api.add_resource(AuthServiceController,'/authorization') 


api.add_resource(AuthServiceController,'/authentication') 




각 URL 마다 서로 다른 Controller를 수정하면 정상적으로 동작된다. 

Posted by '김용환'
,

Play2 Frame에는 괜찮은 인증이 있지만.. 간단하게 구현한 인증 방식(basic authentication)이다.



application.conf


play.http.filters = filters.Filters



Filters.java

package filters

import javax.inject.Inject

import play.api.http.{DefaultHttpFilters, EnabledFilters}

class Filters @Inject() (
defaultFilters: EnabledFilters,
logging: LoggingFilter,
authFilter : AuthFilter,
) extends DefaultHttpFilters (defaultFilters.filters :+ logging :+ authFilter : _*)



AuthFilter.java

package filters

import javax.inject.Inject

import akka.stream.Materializer
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}

class AuthFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {

def apply(nextFilter: RequestHeader => Future[Result])
(requestHeader: RequestHeader): Future[Result] = {
if (!requestHeader.path.startsWith("/login") && requestHeader.headers.get("X-Auth-User").isEmpty) {
Future(Results.Forbidden)
} else { // AuthService.authenticate(requestHeader.headers.get("X-Auth-User"))
nextFilter(requestHeader).map { result =>
result
}
}
}
}


여기에 X-Auth-User 정보를 읽고 임의의 AuthService라는 클래스를 사용해 매번 호출마다 인증을 해볼 수도 있다. 









Posted by '김용환'
,