반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Corona: iOS 6 and Xcode 4.5 are GM!

2012. 9. 21. 05:15 | Posted by 솔웅


반응형
Posted on . Written by



오늘 애플이 공식적으로 iOS 6와 Xcode 4.5를 릴리즈 했습니다.

iOS 6, by default


iOS 6 가 beta 버전이었을 때 특별히 iOS 6에 맞춰코로나를 빌드하는 법에 대해 말씀 드렸었습니다.

daily build 919 부터 모든 디바이스 빌드들은 자동적으로 iOS 6 에 맞게 빌드 됩니다. 더 이상 target iOS SDK를 select 할 필요가 없습니다. 그 선택기능은 단지 iOS 가 beta 일 경우에만 제공하는 한시적인 기능이었습니다.

iOS 6 용으로 빌드하기 위해서는 여러분의 Xcode를 4.5 GM으로 업그레이드 해야 합니다. (4.5 GM seed 와 혼동하지 마세요.) 오늘부터 애플에서 4.5 GM 을 다운받아서 설치하실 수 있습니다.






Fate of iOS 4.3


당분간은 여러분이 빌드하는 앱들이 iOS 4.3 까지 지원이 되겠지만 곧 iOS 5.1 버전까지로 제한이 될 겁니다. 그 이유로는 두 가지가 있습니다.

우선 이전에 제가 설명드린 적이 있는데요. 애플은 iOS의 오래된 버전에 대한 support는 하지 않습니다. 그러니까 굳이 애플이 지원하지 않는 버전까지 우리들이 고민할 필요는 없습니다.


두번째로는 iOS 4.3 을 사용하는 디바이스들은 iOS 5.1 로 업그레이드 할 수 있습니다.


CoronaBuilder


만약 여러분들 중 자동적으로 최신 build가 적용되는 CoronaBuilder를 사용하시는 분들은 다음 daily build 에 몇가지 조정을 하셔야 합니다.


첫번째로 물론 Xcode 4.5GM 으로 우선 업그레이드 하셔야 합니다.


다음으로는 ‘sdkPath’ param 을 수정하셔야 합니다. 새로운 SDK location으로 point 하도록 말이죠. 이전 버전의 Xcode에는 ‘/Developer’에 인스톨 돼 있었을 겁니다. 새로운 버전의 Xcode 는 일반적으로 ‘/Applications/Xcode.app/Contents/Developer’에 위치해 있을 겁니다.


마지막으로 CoronaBuilder 최신버전을 가지고 있으시다면 아마 iOS 6 Beta seeds 에 맞게 빌드해 보셨을 겁니다. 그런 경우 daily build 919를 시작할 때  ‘platformVersion’ key를 먼저 지우셔야 합니다.


Enterprise, armv7s


Corona Enterprise devs도 마찬가지로 우선 Xcode 4.5 GM 으로 업그레이드 된 상황이라야 되구요. 그 다음에 daily build 919를 사용하시면 됩니다.

기존에 존재하는 Xcode project를 빌드하려고 하시면 아마 linker 에러를 보시게 될 겁니다.


ld: file is universal (2 slices) but does not contain a(n) armv7s slice

그 이유는 Xcode는 애플의 새로운 A6 Soc를 사용하는 iPhone 5를 지원해야 하기 때문입니다.

이 chip 은 modern ARM cores에 의해 사용되는 old 'armv7'을 지우ㅝㄴ합니다. 또한 armv7s를 지원하고 VFPv4와 a.k.a vector floating point를 지원합니다.


현재 Corona는 armv7s를 지원하고 있지 않습니다. 조만간 지원할 예정입니다. 그동안 여러분의 Xcode project에 약간의 adjustment를 해 주셔야 합니다. 아니면 여러분의 프로젝트를 CoronaSampleApp Xcode project 를 사용해서 처음부터 다시 빌드하셔도 됩니다.


Xcode 4.5 에서 여러분의 Xcode project를 open 하면 아래와 같은 화면을 보실 겁니다.

armv7과 armv7s 두개가 현재 standard 인것이 보일 겁니다.





여러분이 하셔야 할 일 중 가장 핵심적인 일은 디바이스를 위한 build는 오직 armv7 이라는 겁니다. (armv7s 는 없애 주세요.) 그 작업을 하고 난 후 보이는 화면은 아래와 같을 겁니다.






이 셋업의 의미는 여러분이 Xcode에게 디폴트로 계속 standard instruction set를 사용하고 싶다고 얘기하신 겁니다. 하지만 iOS에는 armv7용으로만 build 하라고 하는 behavior를 override 한 것을 추가 한 것이구요. delete키를 누르면 쉽게 제거할 수 있고 또 추가도 쉽습니다.


여러분의 Xcode project 에 직접 adjustment 한다면 왼쪽 pane에서 Tartget 대신 Project를 선택하시는 것을 잊지 마세요.

반응형

코로나 Enterprise

2012. 9. 20. 04:44 | Posted by 솔웅


반응형

지난 8월 2일 코로나 Enterprise 버전이 발표 됐었습니다.

그동안 제목만 보고 그냥 지나쳤는데 이 Enterprise 버전이 어떤건지 한번 살펴 보겠습니다.


Unlock unlimited mobile development possibilities.


Corona Enterprise builds 는 개발 기간을 혁신적으로 줄여주고 을 다양한  mobile development platform에서 작동할 수 있을 뿐만 아니라 native Object-C 나 java library를 call 하는 기능이 추가 됐습니다. 독립 개발자와 스튜디오 운영자들 그리고 게임이나 앱을 만드는 agences 에게 훨씬 효율적이고 질 높은 서비스를 제공합니다.

optional component인 Corona Builder는 자동으로 빌드하는 기능을 제공해 여러분 팀이 apps and games 쪽에 집중해서 질 좋은 제품을 만들 수 있도록 도와 줍니다.




Enjoy native library access


Corona SDK mobile development의 power 와 speed를 모두 활용하면서 다른 native-C based나 Java library 까지 이용하실 수 있습니다.

특정 기능을 처리하기 위해 여러분만의 코드를 write 하셔야 되나요? 문제 없습니다. 3rd party service를 활용하고 싶으신가요? 아주 간단합니다. build 시 그 라이브러리들을 그냥 include 하시면 됩니다. 필요한 Lua bindings 만 사용하시면 되요.

Corona Enterprise의 architecture를 알고 이것이 어떻게 작동되는지 자세히 살펴보고 싶으시면 documentation를 보세요.




Build on mobile industry standards


Corona Enterprise는 CoronaSDK에서 사용하는 같은 core engine을 사용하고 있습니다. 코로나의 모든 기능들을 활용하실 수 있습니다. 또한 OpenGL, OpenAL, Box2D physics and third party services 그리고 Facebook Connect, Game Center, Google Maps 같은 것들을 활용하는 기능을 추가로 사용하실 수 있습니다.

Corona Enterprise builds는 수시로 업데이트 되는 코로나의 Daily Build와 동기화 되어 있습니다. 그러니까 언제든지 Corona SDK의 최신 버전 및 최신 기능을 모두 활용하실 수 있습니다.



Facilitate effective teamwork


Corona Enterprise의 Hosted Templates는 여러분 팀이 최대한 효율적으로 일할 수 있도록 도와줍니다.

Objective-C 나 Java developer를 여러분의 native library들과 같이 사용하실 수 있고 그것들을 우리의 cloud에 host 할 수 있습니다. 그럼으로서 Lua 개발자들과 디자이너들은 핵심기능과 gameplay 부분에서 Objective-C나 Java 라이브러리와 함께 작업한 사항들을 코로나 시뮬레이터를 통해서 확인하면서 작업하실 수 있습니다.




Automate your builds

Corona Builder는 자동 빌드를 가능하게 해 개발의 효율성을 높였습니다. 그럼으로서 팀원들이 다른 주요한 기능들에 좀 더 집중할 수 있도록 만들었습니다.



반응형


반응형

Corona Guidelines: iPhone 5 and iOS6 (Preliminary)


Posted on . Written by



iPhone 5 (아이폰 5) 는 아마 가장 빨리 많은 양이 팔리는 기기가 될 것 같습니다. 이제 iPhone 5 와 iOS 6 를 대비해서 여러분이 만드는 코로나 앱을 어떻게 준비해야 되는지 알아 봅시다. 가장 큰 부분은 여러분의 코로나 앱을 16:9 의 화면 비율에 맞게 만드셔야 한다는 겁니다. 저희들은 이것을 tall app 이라고 부릅니다. (아이폰 4나 아이폰 4의 전통적인 앱의 화면 비율이 더 짧은 것과 비교해서 그렇게 부릅니다.)



Preparation


첫번째로 해야 될 것은 XCode 4.5 SDK GM seed를 인스톨 해야 됩니다. 애플은 지난 수요일 이것을 공개 했었습니다. 이전 버전의 XCode가 있다면 이 새 버전을 다운 받으세요. 이것이 있어야 IOS App Store에 iOS 6 앱을 submit 할 수 있도록 해 줍니다. 또한 이 Xcode를 깔아야 “iPhone (Retina 4-inch)”, a.k.a. iPhone 5 에 맞는 XCode 시뮬레이터에서 여러분의 앱을 미리 보실 수 있습니다.






Updates to Corona



저희들은 iOS6와 iPhone 5 를 타겟으로 해서 앱을 만들 수 있도록 하는 몇가지 주요한 업데이트를 했습니다. 유료 구매자분들은 이 업데이트 버전을 다운받으실 수 있는데요. daily build 912 버전을 다운 받으시면 됩니다.


daily build 911 부터 디바이스 빌드시 ‘XCode 4.5 GM seed’를 사용할 수 있도록 했습니다. 아래 화면에서와 같이 Build dialog 박스에서 iOS SDK 를 5.1이 아니라 “6.0 GM seed”를 선택하는 것을 잊지 마세요.




다음주초에 애플은 final GM을 릴리즈 할 계획입니다. 그 때 iOS 5 용을 없앨 겁니다. 그 이후의 빌드들은 모두 iOS 6를 타겟으로 하게 될 겁니다.



또한 코로나 시뮬레이터에 iPhone 5 스킨을 추가했습니다. 맥이나 Win 유저 모두 이 스킨을 사용하실 수 있습니다. 여러분이 이 tall app을 만드신다면 이 스킨을 사용하셔야 합니다. 만약에 traditional app을 만드신다면 iPhone 4 스킨을 사용하셔야 되구요.


(Entreprise customers : 엔터프라이즈 데일리 빌드는 다음주 애플이 iOS 6 GM 최종버전을 발표한 이후 업데이트 할 예정입니다.)



iPhone 5, Duck Typing, and the Black Bars



여러분 중 애플의 keynote를 보신분이 계시다면 현재 만든 앱들은 iPhone 5에서 letterboxed 되서 보여질 거라는 걸 보셨을 겁니다. i.e. the “black bars”.


이게 정확히 어떻게 보야진다는 걸까요?


저희들이 살펴본 바에 따르면 iPhone 앱이 iPad 에서 작동될때와는 다른현상이 나타납니다. iOS5에 맞게 작업된 현재의 iOS 앱들은 iPhone 에서는 traditional app으로 취급 될 겁니다.






무슨 의미냐 하면 iPhone 5는 그 화면 비율을 320X480 포인트 (640X960 pixels)로 생각할 겁니다. 그러면 어떻게 나타나냐 하면요. status bar 가 black bar 밑에 나타나게 됩니다. 그리고 black bar 지역에서는 rendering이나 touch 등이 먹히지 않을 겁니다.




It’s similar to duck typing:if it walks like a duck, talks like a duck, and acts like a duck, well then by golly it is a duck! This is the sleight of hand, Apple is playing on apps to make it easy on developers. If you want your app to think it’s on the same ol’ traditional iOS device, then just go merrily along.



Supporting “tall” apps



좋습니다. 이제 여러분 앱이  iPhone 5 에 맞게 좀 더 긴 비율의 기기를 지원하려면 어떻게 해야 할까요? 포럼에서 이미 읽으셨듯이 여러분의 project에 특별한 file을 추가하셔야 합니다. 이렇게 하면 iPhone 5의 tall mode에서 작동될 수 있을 겁니다. “Default-568h@2x.png” 라고 하는 tall splash image가 있어야 합니다.



아래에 주의하셔야 할 몇가지 사항을 정리했습니다.


  • 반드시 iOS 6.0 GM 로 빌드하셔야 합니다. 애플은 iPhone 5를 iOS5가 아니라 iOS6로 테스트 했습니다.  만약 여러분이 iOS 5로 tall mode를 만드는데 성공을 한다면 아주 운이 좋은 케이스이긴 하지만 애플은 그것을 지원하지 않을 겁니다.  코로나에서 iOS 6를 타겟으로 빌드를 하시면 그 이전 버전의 iOS에도 자동적으로 지원이 되는 앱이 만들어 질 겁니다.

  • XCode simulator 는 tall mode로 play를 시작하면 조금 까다로와 집니다. tall splash image를 없애도 그런 현상이 일어날 겁니다 예를 들어 여러분이 traditional mode로 run 하기를 원해도 그대로 tall mode로 보여질 겁니다. 만약에 tall 모드와 traditional 모드를 바꿔서 보고 싶으시다면 그 앱을 uninstall 하셔야 합니다. 혹은 “Reset Content and Settings…” menu 를 사용해서 시뮬레이터를 reset 하셔야 됩니다. 그리고 clean builds를 할 필요가 있을 겁니다. 예를 들어 여러분의 Mac에 있는 .app bundle의 이전 빌드를 delete 해야 합니다.

  • dispatch 되지 않은 iPhone 5 의 bottom 부분에서 일어나는 began과 ended touch 관련 이슈들을 해결했습니다.





Coexistence of tall and traditional apps



애플은 애플입니다. 애플은 여러분의 iOS 앱이 iPhone 5에서만이 아니라 모든 iOS 디바이스들을 지원하기를 원할겁니다. 그렇게 하기 위해 여러분에게는 두가지 choice 가 있습니다.


  1. Easy:  오직 traditional 스크린만 지원하는 겁니다.이게 가장 손 쉬운 방법이죠. 지금까지 해 왔던 방법이니까요. 그냥 해 왔던 대로 하시면 됩니다.
  2. Harder: tall과 traditional 스크린 모두를 지원하는 겁니다. 약간 트릭을 사용하셔야 합니다. iPhone 5와 기존의 아이폰 스크린 모두에서 작동하는 앱을 만들려면 거기에 맞는 각각의 UI를 만드셔야 하죠.  기존의 아이폰에서 작동할 때에 표시될 UI를 따로 만드셔야 할 겁니다.


Scenario #1 은 쉽습니다, 거기에 따로 설명을 덧붙일 필요는 없을 겁니다.  Scenario #2 은 조금 더 작업을 해야 하죠. 왜냐하면 extra screen 공간에 맞는 디자인을 더 해야 하니까요.

Scenario #2를 따르려면 코로나의 기능을 제대로 알아야 그 기능을 활용해서 좀 더 쉽고 정확하게 작업을 하실 수 있을 겁니다. 저희는 여러분의 앱이 taller screen에서 작동하는지 여부에 대해 감지할 수 있는 새로운 API들을 추가했습니다.


가장 쉽게 체크하는 방법은 아래와 같이 하는 겁니다.


local isTall = ( "iPhone" == system.getInfo( "model" ) )
and ( display.pixelHeight > 960 )
 

이렇게 스크린이 tall 인지 traditional인지 알아낸 다음 거기에 맞게 display 하도록 코딩을 하시면 됩니다. 운이 좋으시다면 이미 여러분이 만든 앱이 긴 화면의 안드로이드 기기에서 제대로 보이도록 만든 이미지가 있을 테고 그러면 그 이미지를 그냥 활용하시면 됩니다. 그렇지 않으면 여러분의 앱을 tall 모드에 맞게 업그레이드하는데 들이는 노력이 필요한지 아닌지를 먼저 생각하실 필요가 있습니다.


* * *


여러분이 보시다시피 저희들은 여러 부분에 대해 디테일 하게 분석을 하고 대처를 하고 있습니다.

저희 개발자중 한명이 이쪽 바닥을 이렇게 표현을 하더군요. “It’s never a dull moment.”


Amen to that!




반응형


반응형

FAQ Wednesday: native.newTextField and native.newTextBox Events


Posted on . Written by


It’s Wednesday and time for another FAQ session. Here are five frequently asked questions (FAQ).


1. Why is the “submitted” event phase missing for native.newTextField on devices but it’s working on the Mac Simulator?


“submitted” phase는 유저가 키보드의 “return” or “done” key 를 눌렀을 때 보내 집니다. 이것은 유저가 텍스트 입력 작업을 끝마치고 해당 정보를 “submitted” 했다는 것을 가리키는 것이죠. 유저가 다른 필드를 클릭해서 포커스가 바뀔 경우는 보내지지 않을 겁니다. build 904 버전 이전에는 맥 시뮬레이터는 항상 “submitted” and “ended” phases 가 같이 보내졌습니다. (submitted key 가 클릭되지 않았을 때도요). build 904 부터 맥 시뮬레이터는 iOS와 Android가 작동되는 것과 비슷하게 작동하게 됐습니다.




2. I’m confused about the “ended” and “submitted” phases for native.newTextFields.


TextField events가 작동하는 과정을 요약해 보겠습니다. 유저가 textfield를 클릭(터치)하면 “began” phase가 보내지고 키보드가 보여집니다. 타이핑이 일어나면 “editing” phase가 발생하죠. return/done button 이 클릭되면 ended” phase 가 보내진 다음에 “submitted” phase가 보내집니다. 만약 유저가 다른 Textfield나 다른 TextBox를 터치했다면 “submitted” phase는 보내지지 않고 “ended” phase만 보내지겠죠.


iOS에서는 number 를 넣을 TextField를 생성했을 경우 return key 가 없는 키보드가 나올 겁니다. 그러니까 유저가 일을 마쳤을 때 누를 버튼을 제공해 줘야 합니다. 키보드를 감추려면 native.setKeyboardFocus를 nil 로 하셔야 됩니다. 이렇게 키보드를 숨길 때 TextField 객체에 대한 “ended” phase 가 생성됩니다.

Note: 위의 상황은 build 904 버전 이후의 맥 시뮬레이터에서만 작동됩니다.



3. What happened to the “submitted” event phase on native.newTextBox?


newTextBox에는 submitted event phase가 없습니다. 이유는 return 키를 누르면 입력한 값이 submit 되는 것이 아니라 다음 줄로 가기 때문이죠. 이전 질문에서 언급됐듯이 유저가 작업이 끝났을 때 누를 수 있는 버튼을 생성하셔야 합니다.



4. When using native.newTextField, how do I hide the keyboard?


native.newTextField or native.newTextBox에서 키보드를 숨기려면 native.setKeyboardFocus 를 nil 로 하시면 됩니다. 역으로 native.setKeyboardFocus를 이용해서 포커스를 줄 수도 있습니다.



5. How can I edit text in the native.newTextBox?


디폴트로 native.newTextBox 는 editable이 아닙니다. object.isEditable = true를 하셔서 edit mode를 enable로 바꾸실 수 있습니다.


That’s it for today’s questions. I hope you enjoyed it and even learned a few things.



반응형

Database Authentication

2012. 9. 12. 21:01 | Posted by 솔웅


반응형

Database Authentication


DatabaseAuthentication 클래스는 열결된 데이터베이스에 있는 authentication과 user/group 정보를 제공합니다. 데이터베이스는 main configuration file에 셋업된 디폴트 데이터베이스를 사용할 수도 있고 그 자체의 credential과 세팅을 가지고 있는 별도의 시스템을 사용할 수도 있습니다. 여러분은 이 authentication data를 찾는데 사용되는 테이블을 customize 할 수 있습니다. 그리고 비밀전호 hash를 위한 알고리즘을 지정할 수도 있습니다. authority도 최소한의 configuration으로 새로운 series of table들을 쉽게 셋업할 수 있도록 디폴트 세팅 세트를 제공합니다.


Note : 현재 이 authority에서는 유저나 그룹을 생성하거나 관리하는 기능을 제공하지는 않습니다. 이 글은 여러분이 이미 만들어진 시스템에 연결하는 상황 그리고 여러분이 유저와 그룹을 관리하는 상황을 가정하고 작성되었습니다.




Configuration


DatabaseAuthentication authority는 여러 configuration value들을 가지고 있습니다. 모두 optional 입니다. 아래 value들이 데이터베이스에 연결하는데 영향을 미치는 것들입니다.

  • DB_TYPE - database system은 PDO를 통해 mysql과 sqlite를 지원합니다. 
  • DB_HOST - used by db systems that are hosted on a server
  • DB_USER - used by db systems that require a user to authenticate
  • DB_PASS - used by db systems that require a password
  • DB_DBNAME - used by db systems that require a database
  • DB_FILE - used by db systems the use a file (i.e. sqlite).


위 값들 중 빠진 값들은 SITE_DIR/config/site.ini에서 connectivity settings 을 가져와서 디폴트로 사용할 겁니다. 데이터베이스에 query를 어떻게 할지에 대한 여러 옵션들이 있습니다. 이 때 유저와 그룹 모두를 사용할 필요는 없습니다. 한가지만 필요하면 그걸 사용하시면 됩니다.


아래 값들은 데이터가 위치한 데이터베이스 테이블의 authority를 나타냅니다 :


  • DB_USER_TABLE - (users) The name of the table that stores the user records. This table should at least have fields for userID, password and email. It can also have fields for first/last name or full name. Each row should contain a single user entry
  • DB_GROUP_TABLE (groups) The name of the table that stores group information. It should have fields for shortname and group id. Each row should contain a single group entry.
  • DB_GROUPMEMBERS_TABLE - (groupmembers) The name of the table that stores the members of each group, it should have a field for the group name/id and the userID of the user. Each row should contain an entry that contains the group name and userID. The system will search for members that match the group name.


아래 값들은 어떤 필드들을 사용할지에 대해 authority에 알려 줍니다. :


  • DB_USER_USERID_FIELD (userID)- stores the userID in the user table. For systems that use the email address as the key, you should include the email field
  • DB_USER_PASSWORD_FIELD (password) -stores a hashed value of the user’s password. See DB_USER_PASSWORD_HASH for possible hashing algorithms (Default is md5)
  • DB_USER_EMAIL_FIELD (email) - stores the email in the user table
  • DB_USER_FIRSTNAME_FIELD (empty) - stores the first name of user. Won’t be used unless it is specified
  • DB_USER_LASTNAME_FIELD (empty) - stores the last name of user. Won’t be used unless it is specified
  • DB_USER_FULLNAME_FIELD (empty) - stores the full name of user. Won’t be used unless it is specified
  • DB_GROUP_GROUPNAME_FIELD (group) - stores the short name of the group in the group table
  • DB_GROUP_GID_FIELD - (gid) - stores the group id of the group in the group table. Should be numerical
  • DB_GROUPMEMBER_GROUP_FIELD (gid) - which field to use when looking up groups in the group member table. This is typically the same value as the group name or gid field
  • DB_GROUPMEMBER_USER_FIELD (userID) - which field to use when looking up user in the group member table. This is typically either the userID or the email
  • DB_GROUPMEMBER_AUTHORITY_FIELD - If present you can store the authority index in this field. This allows the system to map group members to other authorities.


다른 값들은 어떻게 그룹 멤버쉽이 키가 되는지를 알려줍니다.


  • DB_GROUP_GROUPMEMBER_PROPERTY - (gid) - This is not stored in the database, but refers to which field will be used to look up group information in the group member table. Valid values are gid or group (i.e. the shortname) gid is the default.


암호 해싱 방법과 관련한 값들도 있습니다.


  • DB_USER_PASSWORD_HASH (md5) - This is a string that represents a valid hashing function. It indicates what

    hashing algorithm is used to store the password. See hash_algos() for a list of valid hashing algorithms. Keep in mind that available algorithms may differ by PHP version and platform. You can also use the hmac_ prefix to use the hmac signing method (i.e. hmac_sha1). This requires setting the DB_USER_PASSWORD_KEY value.

  • DB_USER_PASSWORD_KEY (empty) - Necessary if you use the more secure hmac variant hashing algorithms. This uses a shared key to sign the value using hash_hmac

  • DB_USER_PASSWORD_SALT_BEFORE (empty) - If present this string will be prepended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_AFTER (empty) - If present this string will be appended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_FIELD_BEFORE (empty) - If present the value of this field for the user will be prepended to any string as a salt value before hashing. This is useful if you are using variable salts.

  • DB_USER_PASSWORD_SALT_FIELD_AFTER (empty) - If present the value of this field for the user will be appended to any string as a salt value before hashing. This is useful if you are using variable salts.


How it Works


User Authentication


USER_LOGIN을 FORM으로 해서 user authentication 을 지원한다면 authority는 USER_TABLE을 볼겁니다. 그리고 타입된 값과 맞는 DB_USER_USERID_FIELDDB_USER_EMAIL_FIELD 의 레코드 값을 찾을 겁니다. 해당 record를 찾으면 DB_USER_USERID_FIELD에 있는 값이 type 된 패스워드의 hashed 값과 매치 되는 지를 볼 거구요. (이때 DB_USER_PASSWORD_HASH algorithm을 사용합니다.) 데이터베이스에서 사용한 해쉬 알고리즘과 configuration에서 지정한 해쉬 알고리즘이 동일해야 합니다.


User Lookup


Users는 DB_USER_TABLE를 살피고 요청된 값과 DB_USER_USERID_FIELD or DB_USER_EMAIL_FIELD의 record 가 맞는지  봅니다. 만약에 맞는것을 찾으면 user object는 생성됩니다. 생성되는 것들은 값이 있는 경우 다음의 내용이 포함됩니다. B_USER_USERID_FIELD, DB_USER_EMAIL_FIELD and DB_USER_FIRSTNAME_FIELD,*DB_USER_LASTNAME_FIELD* and DB_USER_FULLNAME_FIELD


Group Lookup


Groups은 을 살피고 요청된 값과 DB_GROUP_GROUPNAME_FIELD or DB_GROUP_GID_FIELD의 record가 맞는지 봅니다. 만약에 맞는 것을 찾으면 group object가 생성됩니다. 생성되는 것들은 DB_GROUP_GROUPNAME_FIELD and DB_GROUP_GID_FIELD 값입니다.


Group Membership Lookup


Group membership은 DB_GROUPMEMBERS_TABLE안에서 query 됩니다. getMembers() 메소드는 DB_GROUPMEMBER_USER_FIELD를 사용해서 유저 객체 배열을 만듭니다.  DB_GROUPMEMBER_GROUP_FIELD 와 매치되는 모든 users는 return 됩니다. (DB_GROUP_GROUPMEMBER_PROPERTY,를 사용해서 리턴됩니다. 예:gid,short name) 그 user 객체들은 DB_GROUPMEMBER_AUTHORITY_FIELD에 의해 authority reference 되서 생성됩니다. 만약에 authority field 가 없으면 그룹과 같은 authority를 사용합니다. (예: DB_USER_TABLE를 사용할 겁니다.) 테이블의 다른 authority를 참조할 수 있습니다. (예: ldap users, google users 등)


Using Default Values


여러분의 reference database를 include 하고 싶으시면 아래와 같이 정의된 테이블의 모든 디폴트 값을 사용할 수 있습니다.



CREATE TABLE users (userID varchar(64), password varchar(32), email varchar(64),

firstname varchar(50), lastname varchar(50)); CREATE TABLE groups (`group` varchar(16), gid int); CREATE TABLE groupmembers (gid int, authority varchar(32), userID varchar(64));


이것은 디폴트 값들과 호환되는 테이블 구조입니다.


반응형

선그리기 기초 부터

2012. 9. 9. 22:01 | Posted by 솔웅


반응형

웹앱 프로젝트를 하느라고 오랫동안 코로나 개발에서 손 뗐었는데요.

너무 오래 안하다 보니까 그립네요.


써핑하다가 코로나 팁을 공유한 파일이 있어서 정리해 봅니다.


가장 기초적인 기능인 선 그리기 입니다.


일단 코드부터 볼까요?


display.setStatusBar( display.HiddenStatusBar ) -- Hide the status bar
 
local bx, by=0, 0
local lines={}
local p=1
 
local function drawALine(event)
    if "began"==event.phase then
        bx, by=event.x, event.y
       
    elseif "moved"==event.phase then
        lines[p]=display.newLine(bx, by, event.x, event.y)
       
        --Width
        lines[p].width=12

        --Alpha
        lines[p].alpha=1
       
        --Color
        lines[p]:setColor(255,255,255) -- White       
       
        bx, by=event.x, event.y
        p=p+1
       
        print(p);
       
    end    
end
 
Runtime:addEventListener("touch", drawALine)


맨 첫번째 줄은 아이폰에서 status bar를 없애는 코드입니다.

그리고 무엇인가를 그리려면 좌표가 필요하니까 x,y 좌표를 담을 변수를 만들었구요.

그 다음에 line 이라는 배열을 만들었습니다.


여기서 선 그리기는 시작점과 끝점을 찍어서 그 두 점을 연결하는 직선을 만드는게 아니라

손가락이 움직이는대로 따라서 선이 그어지도록 하는거거든요.


그러면 손가락을 따라 계속 선을 그어서 그 촘촘하게 그려진 선들이 결국에는 하나의 선처럼 보이게 하는 겁니다.


그래서 lines[] 라는 배열 만들었습니다.

그리고  p 는 변수에 차례대로 선들을 담기 위한 숫자로 쓰일 변수이구요.


이렇게 변수 선언 한 다음에는 drawALine 이라는 함수가 있는데요.


이 함수 건너뛰고 이벤트 리스너 부터 보겠습니다.

touch 에 반응하도록 했고 drawALine을 call 합니다.

그리고 어떤 객체에 이벤트 리스너를 단 것이 아니라 Runtime에 달았으니까 앱이 시작하면서 끝날 때까지 계속 활성화 되 있게 됩니다.


이제 핵심 부분인 함수를 볼까요?


우선 매개변수로 이벤트를 받습니다.


touch 이벤트에는 began, moved, ended 같은 phase들이 있습니다.


여기서는 began과 moved 라는 phase를 이용합니다.


우선 began 일 때는 그 이벤트가 일어난 지점 즉 손가락으로 터치한 지점의 x,y 좌표를 위에 선언했던 변수에 담습니다.


그리고 손가락이 조금이라도 움직일 때 발생하는 moved 일 때 drawLine을 사용해서 선을 긋죠.

began에서 저장했던 x,y 좌표에서 현재 움직인 지점의 x,y 까지 선을 긋습니다.

이 첫번째 line은 lines[] 배열 첫번째에 담기겠죠.

아마 코로나는 배열이 1부터 시작할 겁니다. PHP나 JAVA는 0부터 시작을 하죠.


그 다음은 이 그려진 선을 꾸미는 부분 입니다.

첫 부분은 width 를 사용해서 선의 두께를 정하구요. 그 다음은 투명도(alpha)를 정합니다.

그리고 setColor로 색을 정하구요.


이렇게 처음에 그려진 선을 다 꾸몄으면 다음 선을 준비하기 위한 작업을 합니다.

뭐냐하면 bx,by 값을 현재의 x,y 값으로 바꾸는거죠.


그러면 현재의 위치가 다음 moved 가 발생했을 때 시작점이 되는겁니다.

(이걸 하지 않으면 처음 touch 했던 부분부터 계속 선이 그어질 겁니다. 한번 해 보세요.)


그 다음에는 첫번째 선이 지정된 배열의 다음에 두번째선을 넣기 위해서 p에 1을 더합니다.

그 밑에는 제가 그냥 p 를 콘솔에 print 한 겁니다.


이렇게 하면 선긋기는 간단하게 끝납니다.


아래는 quinc 라는 친구가 공개한 선에 여러 효과를 줄수 있는 코드들입니다.


우선 width 부터 볼까요?


        lines[p].width=math.random(1, 30) -- Makes for an interesting "backbone" effect
        lines[p].width=12 -- Just a boring old set width
        lines[p].width=-3 -- I've heard of a line with a width of -3!
        lines[p].width=math.abs(event.y/20) -- 3D-ish horizon look


width 부분에 위 예제들을 하나하나 넣어가면서 실행해 보세요.

첫번째는 width가 1에서 30까지 랜덤하게 설정되는 겁니다. quinc 는 이것을 척추 모양을 내는 효과라고 했네요.

12는 일반적인 효과고 -3도 있네요. 이건 어떨까요?

그리고 y 좌표를 20으로 나눠서 그 절대값을 width 로 하는 것도 있네요.

이것도 효과가 어떨지 궁금한데요.


이렇게 수학 공식을 사용하다 보면 아주 좋은 효과들이 나옵니다.

프로그래밍을 하면 할 수록 수학을 배우고 싶은 마음이 마구 생겨납니다.


누가 수학은 배워봤자 사회에서 써 먹을 일이 없다고 그러는지...

이글 보시는 학생분들 계시면 그런 얘기 믿지 마세요.

수학 진짜 필요합니다.


다음은 투명도 효과를 볼까요?


    lines[p].alpha=1 -- Another boring one
    lines[p].alpha=0.5 -- Half strength line
    lines[p].alpha=math.abs((event.y-(1000-event.y))/1000) -- Darker area near the center
    lines[p].alpha=math.abs(event.y/1000) -- Foggy day
    lines[p].alpha=math.abs(event.x/1000) -- Foggy day...to the side?
    lines[p].alpha=(math.random(100, 1000))/1000 -- Random


여러 효과들이 있는데요. 처음에 알파를 1로 설정한 것은 그냥 투명도 없이 진하게 표시하는 겁니다.

0.5는 반쯤 투명하게 하는 거구요. 다음엔 수학공식을 사용해서 여러 효과를 주었네요.

세번째는 호면 중앙으로 올 수록 진해 지는 건가 봅니다.

그 다음은 아래 윗부분으로 갈 수록 연해지는 효과고 그 다음은 좌우로 갈수록 연해지는 효과 입니다.

그 다음은 그냥 랜덤하게 투명도를 주는거네요.

해 봤는데 별 효과는 없습니다. 그냥 무책임한 랜덤일 뿐이네요.


다음은 색 지정부분 입니다.


        --Flat color
        --lines[p]:setColor(255,255,255) -- White
        --lines[p]:setColor(255,255,0) -- Yellow
        --lines[p]:setColor(255,0,0) -- Red
        --lines[p]:setColor(0,255,0) -- Green
        --lines[p]:setColor(0,0,255) -- Blue
        --lines[p]:setColor(255,0,255) -- Purple
       
        --Interesting color effects
        --lines[p]:setColor(math.random(255)) -- Grayscale
        --lines[p]:setColor(math.random(255), math.random(255), math.random(255)) -- Rainbow
        --lines[p]:setColor(event.x/5, event.x-20/5, event.x+20/5) -- Really odd effect...
        --lines[p]:setColor(event.x-event.y, 0, event.x-event.y) -- Pretty cool, works best with slow movement


첫 부분은 그냥 단색으로 흰색,노랑,빨강,초록,파랑,보라 이렇게 선 색이 주어집니다.

그 다음엔 수학 공식을 사용한 효과로 처음엔 흑백화면처럼 라인 색이 나오면서 진해지고 옅어지고의 변화만 있습니다.

그 다음은 랜덤하게 색을 표시하는 거구요. 그 다음엔 진짜 이상한 효과라고 하네요. 한번 해 보세요.

그 다음엔 천천히 움직이면 아주 좋은 효과가 나온다고 합니다.


그 다음에는 아래 for 문도 하나 예제로 주었습니다.


        for i=1, p do
                lines[i].xScale=lines[i].xScale-0.12; lines[i].yScale=lines[i].yScale-0.12
        end


분석해 보니까 선을 그을 때마다 lines[] 배열에 담겨있는 선들의 크기를 조금씩 크게 만드는 거네요.


이것도 괜찮은 효과 입니다.


이 width, alpha, setColor 효과들을 다양하게 조합해 보면 재밌을 거예요.




위 이미지가 그 중 하나입니다.


아래 quinc 가 올린 파일 원본 소개 합니다.



main.lua


반응형


반응형

Posted on . Written by


수요일 FAQ 시간이 다시 돌아 왔습니다. 아래 자주 반복되는 질문 5가지가 있습니다. 오늘은 Event Listeners와 Display Objects를 어떻게 remove 하는지에 대해 알아보겠습니다.


1. I’m confused about when I need to call removeEventListener?


대표적인 경우는 Runtime:addEventListener를 사용해서 이벤트 리스너를 생성했다면 Runtime:removeEventListener를 call 하셔야 합니다. 만약 object event listener를 생성했다면 그 object를 remove 할 때 object event listener도 remove 해야 합니다.


--------------------------
-- Runtime Listener
--------------------------

function myFrame( event )
    print( "enterFrame", event.time )
end

Runtime:addEventListener( "enterFrame", myFrame )

-- Some time later ...
Runtime:removeEventListener( "enterFrame", myFrame )

--------------------------
-- Object Listener
--------------------------

local rect = display.newRect(10, 40, 100, 50)

function rect:touch( event )
    if event.phase == "began" then
        print( "Rect touched", event.target )
    end
end

rect:addEventListener( "touch" )

-- Some time later ...
rect:removeSelf()
rect = nil


 



2. I see code using “self”. What is that?


self 는 루아 메소드의 hidden 파라미터 입니다. 함수를 call 할 때 그 object에 접근하기 위해 사용하죠. 아래에 그 예제가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
function rect1.touch( self, event )
    if event.phase == "began" then
        print( "Rect1 touched", event.target, self )
    end
end

rect1:addEventListener( "touch" )


local rect2 = display.newRect(10, 160, 100, 50)
function rect2:touch( event )
    if event.phase == "began" then
print( "Rect2 touched", event.target, self )
    end
end

rect2:addEventListener( "touch" )
 

두 예제의 메소드 모두 제대로 작동합니다. 그런데 하나는 "." 를 사용했고
다른 하나는 ":"를 사용했습니다.

콜른(:)을 사용하면 메소드에 hidden self 파라미터를 전달합니다.
그리고 점(.) 을 사용한 것은 이 self를 전달하지 않습니다.
그러니까 점을 사용하면 반드시 첫번째 파라미터로 self를 전달해야 합니다.

코로나는 다른 많은 Display Object API들에 (e.g., object:removeSelf, object:setFillColor, etc.) 이 Lua 기능을 사용하고 있습니다.


이벤트 리스너와 self 를 사용하는 것은 그렇게 유용하지 않을 겁니다. 왜냐하면 대부분의 object listener들은 객체의 handle을 지원하기 위해  event.target 파라미터를 제공하기 때문이죠. 이 파라미터는 self와 같습니다. 여러분이 만든 메소드에는 이 self를 사용할 수 있을 겁니다. 여러 객체에서 같은 메소드를 call 할 때 아주 유용하겠죠.


3. Do I really need to set display objects to nil after I remove them?


그 객체와 관계된 Lua 메모리를  clean up 하기 위해 사용하지 않는 객체에 nil을 할당해야 합니다. display object를 remove 할 때마다 (object:removeSelf) 그 객체의 texture 메모리와 관련된 메소드 그리고 그 객체와 관련된 이벤트 핸들러들은 remove 될 겁니다.  그렇게 되면 그 객체는 일반적인 Lua 테이블로 됩니다. 여기에 nil을 할당함으로서 그 테이블에 대한 reference 까지 remove 하게 됩니다. 그리고 나서 Lua Garbage Collector에 의해 그 테이블이 사용했던 메모리가 free 됩니다.


4. What is the best way to remove display objects from a Display Group?


display group에서 removeSelf 를 하면 그 그룹의 모든 display object들을 remove 할 겁니다. 그 그룹의 각 객체별로 따로따로 removeSelf  할 필요는 없습니다. group에 있는 객체들을 따로 nil 처리할 필요는 없습니다. 그룹 안에 있는 객체가 다른 변수에 의해 reference 된다면 그 variable을 nil로 세팅해야 합니다.


5. How can I tell if a display object was removed?


display object는 table입니다. 그리고 그것과 연관된 texture memory와 메소드들이 있죠. 그러니까 어떤 display object 메소드가 그 object와 아직까지 연관이 돼 있는지 여부를 체크함으로서 해당 display object가 아직까지 존재하는지를 알아 낼 수가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
if type( rect1.setFillColor ) == "function" then
print( "rect is still a display object" )
end


위 예제는 rect1 객체에 setFillColor 메소드를 적용할 수 있는지 여부를 체크하고 있습니다.
어떤 객체에 removeSelf 를 call 하면 그 객체로부터 모든 메소드가 removed 된다는 것을 기억해 두세요.

여기까지가 이번주 QNA 내용이었습니다.

즐거운 주말 되세요.



반응형

Authentication

2012. 9. 6. 21:08 | Posted by 솔웅


반응형

Authentication


특정 모듈에 대해서 검증된 유저만 (authenticated users) 접근이 가능하도록 할 필요가 있습니다. 또는 해당 유저에 알맞는 내용을 제공하거나 feedback에 참여하도록 허용할 수 있겠죠.


Kurogo 프레임워크는 authenticationg users와 내용에 대한 authorizing access 를 위한 기능을 제공하고 있습니다. 이런 기능을 위해서 유저별로 또는 특정한 그룹에 있는 멤버에게만 접근이나 관리의 권한을 주거나 제한하는 서비스를 제공할 수 있습니다.


Kurogo는 기존에 존재하는 identity 시스템과 같이 사용하실 수도 있습니다. 예를 들어 Active Directory, MySQL databases, Twitter, Facebook and Google 등이 있습니다.





Setting up Authentication


Authentication은 유저의 identity를 설립하는 프로세스입니다. 이 identity의 설립은 유저가 username과 password를 제공하면서 가능합니다. 프레임워크는 그 유저이름과 패스워드를 받아서 central authority를 통해서 credential을 test 하게 됩니다. 만약 authority가 credential에 적합하면 유저는 로그인 되고 관련된 서비스나 개인 정보를 사용할 수 있게 됩니다.



쿠로고 프레임워크에 의한 Authentication는 한개 이상의 authentication authorities를 통해서 제공 됩니다. 각 authority는 기존의 authentication system에 connect 하기 위해 configure 돼 있습니다. 여러분 사이트의 필요에 따라 여러분은 거기에 맞는 private self-hosted authentication system (like an LDAP/Active Directory or database system) or a public system (Twitter, Facebook, Google) 들을 사용하실 수 있습니다. 또한 standard authentication services (Google Apps) 같이 외부에서 제공되는 서비스를 사용해서 hybrid로 접근할 수도 있습니다. 간단하게 deploy 하려면 external service 필요없이 flat-file based system을 사용할 수도 있습니다.


각 authority는 아래와 같이 다양한 서비스를 제공할 수 있습니다.


  • User authentication - either through a direct login/password form or through an external system based on OpenID or OAuth
  • User attributes - At minimum authorities should supply id, name and email information. Some authorities can provide this information to any user in their system, however others can only provide this information on the logged in user
  • Group information and membership - Some authorities will also contain information on groups which allow you to logically organize users. Some authorities are designed to only contain users from their own domains, while others have the ability to utilize users from other authorities in their membership


이 모든 서비스를 다 제공할 필요는 없을 겁니다. 하나의 authority는 authentication과 information을 제공하고 다른 것은 group information을 제공하고 이렇게 여러 방법으로 사용될 수도 있습니다. 만약 여러분이 여러분의 authorization schemes에 group을 지정하지 않았다면 group information은 필요 없게 되겠죠.


Enabling Authentication


authenticating users를 지원하려면  SITE_DIR/config/site.ini 안에 있는 AUTHENTICATION_ENABLED 를 1로 세팅해야 합니다. 디폴트는 0 입니다.


Configuring Authorities


Authorities들은 SITE_DIR/config folder에 있는 authentication.ini file 에 정위 됩니다. 각 authority는 각 section에서 설정됩니다. 이 section 이름은 authority index로 사용되는 것이 좋습니다. 프레임워크에 의해 사용되는 programmatic value 죠. 이 value는 여러분이 원하는 대로 하셔도 됩니다. 다만 이전에 사용됐던 section을 중복해서 사용하지 않도록 주의하셔야 됩니다. 만약 중복 되면 문제가 생깁니다.


각 authority는 여러 attribute들이 필요합니다. 그리고 authority type에 따라 더 필요할 수도 있습니다. configuration file에 대한 좀 더 자세한 정보를 원하시면 Configuration를 참조하세요.


아래 내용들은 모든 authorities들에 필요한 값들입니다.


  • TITLE - This value is used when referencing the framework to users. If there is more than one authority available to users to choose the title will direct them to the correct one.
  • CONTROLLER_CLASS - This value should map to a valid subclass of AuthenticationAuthority. This defines the core behavior of the authority.
  • USER_LOGIN - There are 3 possible values:
    • FORM - Use the login form
    • LINK - Use a login link. The authority should handle this using their login method
    • NONE - This authority does not provide authentication services (i.e. just group services)


Included Authorities


Kurogo 프레임워크가 폭 넓은 세팅을 할 수 있도록 하기 위해 프로젝트는 몇가지 클래스들을 가지고 있습니다. 이 클래스들은 다양한 타입의 authentication과 authorization service들에 연결할 수 있도록 합니다.  각각은 나름대로 셋업하고 사용하기 위한 방법들이 있습니다. 아래 문서들을 잘 읽어보시고 개발하고 deploy 하기 위한 중요한 요구사항들을 잘 살펴 보시기 바랍니다.



반응형

Flat File Authentication

2012. 9. 6. 08:59 | Posted by 솔웅


반응형

Flat File Authentication


PasswdAuthentication
class는 로컬에 있는 flat file의 authentication과 user/group 정보를 제공합니다. 가장 간단한 authentication 관리 방법입니다. 다른 서비스를 사용하지 않아도 되죠.


Configuration


PasswdAuthentication authority 는 standard에 2개의 value만이 추가 됩니다.

  • PASSWD_USER_FILE - a path to the user file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/users”

  • PASSWD_GROUP_FILE - a path to the group file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/groups”



Format of the user file


이 user file은 전형적인 유닉스의 passwd 파일과 그 구조가 비슷합니다.

각 라인은 single user를 말합니다. 빈 줄이나 #로 시작하는 줄은 무시될 겁니다. 각 라인에는 : 로 구분되는 field들이 있습니다. 필드의 순서는 아래와 같습니다.

  1. userID - a short name for the user
  2. password - an md5 hash of the user’s password (unix users can use md5 -s “password” to generate a hash)
  3. email - the email address of the user
  4. full name - the full name of the user


Format of the group file


그룹 파일도 유닉스의 그룹파일과 아주 비슷합니다.


각 라인은 single group을 나타냅니다. 빈 줄이나 #로 시작하는 줄은 무시됩니다. 각 라인에서 각 필드들은 : 로 구분 됩니다.

그 필드들의 순서는 아래와 같습니다.


  1. group - a short name for the group
  2. gid - a numerical id for the group
  3. members - a comma separated list of users. Each user is represented by their username/email. If the user is from another authority you should enter it as authority|userID


Usage


이 authority를 사용하는 것은 몇개의 account 만을 다룰 때 유용할 겁니다. 예를 들어 간단하게 username과 password를 가지고 몇개의 모듈만 protect 하기를 원하는 경우가 이것에 해당 될 겁니다.




반응형

Access Control and Authorization

2012. 9. 6. 03:53 | Posted by 솔웅


반응형

Access Control and Authorization


유저의 identity를 얻으면 그 identity 에 근거해서 제한된 모듈을 사용할 수 있도록 하는 authorize 가 가능해 집니다. Authorization은 access control lists에 의해서 이뤄 집니다. 개발자들은 아마 다른 contexts에 더 익숙하시겠죠? 예를 들어 파일 시스템 같은......


Access Control Lists


access control list 는 어떤 리소스에 접근이 가능한 이들을 정의해 놓은 rule들을 열거한 겁니다. (ALLOW rules) 물론 그 리소스에 어떤 이들의 접근을 막을지에 대해서도 정의해 놓을 수 있겠죠. (DENY rules). 룰들은 유저와 그룹별로 정의 될 수 있습니다. 여러분 사이트의 필요에 따라 혼합하거나 해서 사용하실 수 있습니다.


Access control lists SITE_DIR/config/acls.ini  (site authorization)나 SITE_DIR/config/MODULE/acls.ini (module authorization)에 정의 돼 있습니다. 


만약 그 site 에 access control list entry가 있다면 (in SITE_DIR/config/acls.ini), 이 조건은 모든 모듈에 적용이 될 겁니다. site가 아니라 module 이 access control list entry 를 가지고 있다면 (in SITE_DIR/config/MODULE/acls.ini), acl 룰에 맞는 유저만이 접근할 수 있게 됩니다.


아래와 같은 경우에 유저는 접근 권한을 가질 겁니다.


  • They match an ALLOW rule, AND
  • They do NOT match a DENY rule


만약 유저가 DENY 룰에 속하면 즉각 접근 제한이 됩니다.

이 Access control lists 는 Administration Console에서 수정될 수 있습니다.




Syntax of Access Control Lists


각각의 ACL은 acls.ini 파일에 있는 section입니다. 첫번째 ACL은 section 0 가 되고 두번째는 1 이 됩니다. 각 섹션은 key들을 가지고 있습니다.


  • type: Either U (for user access, i.e. who can use the module), or A (for admin access, who can administer the module).
  • action: Either A (allow) or D (deny). Deny rules always take precedence.
  • scope: Either U (user), G (group) or E (everyone, i.e. ALL users, including anonymous users),
  • authority: The index of the authority. For user scope this can be blank and would match a user from any authority.
  • value: The particular user/group to match. For user scope this can be “*” which would match all authenticated users.


이 신택스를 구현하는 방법을 이해하시려면 아래 예제를 보세요.

admin 모듈에 대해 만드려면 아래와 같이 될 겁니다.



[0]
type = "U"
action = "A"
scope = "G"
authority = "ldap"
value = "admin"

[1]
type = "U"
action = "A"
scope = "G"
authority = "ad"
value = "domainadmins"

[2]
type = "U"
action = "D"
scope = "U"
authority = "ad"
value = "Administrator"



이 의미는 ldap authority 의 admin 그룹의 멤버들과 ad authority 의 domainadmin 그룹들에게 접근이 허용 될 겁니다.  그리고 특별히 ad authority의 Administrator 그룹에는 접근이 허용되지 않습니다.


Using the Flat-file Authority to extend other authorities


flat file authority 인 PasswdAuthentication는 다른 시스템이 아닌 웹서버에 저장돼 있는 flat-file을 사용해서 유저나 그룹들에게 접근을 허용할 수 있습니다. 이 경우는 유저가 적어서 굳이 authority 시스템을 관리하느라 시간을 낭비하고 싶지 않은 경우에 유용하게 사용 될 수 있습니다.


그리고 데이터베이스 서버(혹은 SQLite)가 있고 여러분이 그것을 관리하고 있다면 이 데이터베이스에 저장된 값을 가지고 사용하는 DatabaseAuthentication authority 도 사용할 수 있습니다.



이러한 방법들에 대해 좀 더 알고 싶으시면 instruction을 참조하세요. 유저 login을 사용하고 싶지 않다면 USER_LOGIN을 NONE으로 세팅해 놓으세요.



반응형