ស្វែងយល់អំពី Security នៅក្នុង Symfony3 (វគ្គទី០១)

Symfony’s security system គឺពិតជាអស្ចារ្យនិងមិនគួរអោយជឿ តែវាក៏អាចមានការយល់ច្រលំទៅនឹងការតម្លើងផងដែរ។ ក្នុងជំពូកនេះ អ្នកនឹងរៀនអំពីរបៀបតម្លើង ​security របស់ application ម្ដងមួយជំហ៊ានៗ ដោយចាប់ផ្ដើមពីការ configure នូវ firewall និងរបៀបដែលអ្នកធ្វើការ load users អោយទៅជា access denied និងការចាប់យក User object។ ដោយផ្អែកទៅលើអ្វីដែលអ្នកត្រូវការ ពេលខ្លះ អាចនឹងលំបាកនៅពេលរៀបចំដំបូង ប៉ុន្តែពេលធ្វើវាបានម្ដងហើយនោះ security system របស់ Symfony គឺនឹងមានលក្ខណៈបត់បែនព្រមទាំងងាយស្រួលក្នុងការធ្វើការផងដែរ។

ដោយសារតែវាមានរឿងជាច្រើនដែលត្រូវនិយាយ ដូចនេះមេរៀននេះគឺធ្វើការបែងចែកទៅជា ប៉ុន្មានផ្នែកធំៗ៖

១) ជាដំបូង ធ្វើការតម្លើង security.yml (authentication)

Security system គឺត្រូវបាន configure ក្នុង app/config/security.yml ហើយ configuration ដើមរបស់វាមានលក្ខណៈដូចខាងក្រោម៖

firewall key គឺជា heart នៃ security configuration។ dev firewall គឺមិនសូវសំខាន់ទេ វាគ្រាន់តែជាអ្នករកមើលថាតើ Symfony’s development tools ណាមួយដែលស្ថិតនៅក្រោម URLs ដូចជា /_profiler និង /_wdt ដែលមិនត្រូវបាន blocked ដោយសារតែ security របស់អ្នក។

ចំពោះ URLs ទាំងអស់ផ្សេងទៀតអាចនឹងក្ដោបដោយ default firewall ។ អ្នកអាចគិតបានថា firewall ដូចទៅនឹង security system របស់អ្នក ហើយដូចនេះជាធម្មតាវាធ្វើអោយទៅជា firewall សំខាន់មួយ។ ប៉ុន្តែបែបនេះមិនមែនមានន័យថា  URL ទាំងអស់ទាមទារនូវ authentication – anonymous key ដែលព្រួយបារម្ភពីរឿងនេះ។ ជាការពិត ប្រសិនបើអ្នកចូលទៅកាន់ homepage នាពេលនេះ អ្នកនឹងមានសិទ្ធចូលទៅកាន់និងដឹងច្បាស់ថាអ្នកគឺជា “authenticated” ជា anon

ក) ការ configure ដើម្បីអោយក្លាយជា Authenticate

មុខងារសំខាន់របស់ firewall គឺ configure នូវ ការធ្វើយ៉ាងម៉េចដើម្បីអោយក្លាយខ្លួនជា  authenticate។ ពួកគេនឹងប្រើ login form រឺយ៉ាងណា? HTTP basic authentication? រឺក៏ API token? រឺក៏ទាំងអស់ខាងលើ?

ចាប់ផ្ដើមជាមួយនឹង HTTP basic authentication និងធ្វើការចាប់ពីកន្លែងនេះទៅ។ ដើម្បី activate វាបានត្រូវបន្ថែម http_basic key ខាងក្រោម firewall របស់អ្នក៖

សាមញ្ញបំផុត អ្នកត្រូវទាមទារអោយ​ user ធ្វើការ logged in ដើម្បីមើលឃើញនូវទំព័រ។ ដើម្បីអោយកាន់តែចាប់អារម្មណ៏ អ្នកត្រូវបង្កើត page មួយនៅឯ /admin។ ឧទាហរណ៏ ប្រសិនបើអ្នកប្រើ annotaitons សូមបង្កើតដូចលំនាំខាងក្រោម៖

បន្ទាប់មកទៀត បន្ថែម access_control បញ្ចូលទៅ security.yml ដែលទាមទារនូវ user ធ្វើការ logged in ៖

ពេលនេះប្រសិនបើអ្នកចូលទៅកាន់ /admin  អ្នកនឹងឃើញនូវ HTTP basic auth prompt៖

ខ) configure អំពីការ loaded នូវ Users

ពេលដែលអ្នកវាយ username របស់អ្នក Symfony ត្រូវការ load នូវព័ត៌មានរបស់ user ពីកន្លែងណាមួយ។ នេះហៅថា “user provider” ហើយអ្នកត្រូវធ្វើការ configure វា។ Symfony មានវិធីបង្កើតវាដើម្បី load users ពី database រឺក៏ អ្នកអាច បង្កើត user provider ផ្ទាល់ខ្លួន ក៏បាន។

វិធីដែលងាយស្រួលបំផុតគឺ configure Symfony ដើម្បី load hardcoded user ដោយ​ direct ពី security.yml file របស់វាផ្ទាល់។ នេះគេហៅថា “in memory provider” តែវាកាន់តែប្រសើរប្រសិនបើយើងគិតថាវាជា “in configuration” provider៖

ដូចគ្នាទៅនឹង firewall អ្នកអាចមាន provider ជាច្រើនតែអ្នកប្រហែលអាចនឹងត្រូវការមួយ។ ប្រសិនបើអ្នកធ្វើច្រើន អ្នកអាច configure provider ណាមួយដើម្បីប្រើសម្រាប់ firewall របស់អ្នកដែលនៅខាងក្រោម provider key របស់វា។

ដើម្បីដោះស្រាយបញ្ហានេះ គឺបន្ថែមនូវ encoders key៖

User providers load ព័ត៌មាន user និងដាក់វាទៅក្នុង User object ។ បើអ្នក load users ពី database រឺក៏ source ខ្លះផ្សេងទៀត អ្នកអាចប្រើ custom User class ផ្ទាល់ខ្លួន ប៉ុន្តែពេលដែលអ្នកប្រើ “in memory” provider វាអោយអ្នកនូវ Symfony\Component\Security\Core\User\User object ។

User class របស់អ្នកជាអ្វីក៏ដោយ អ្នកត្រូវប្រាប់ទៅកាន់ Symfony ថា algorithm អ្វីដេលបានប្រើដើម្បី encode នូវ passwords។ ក្នុងដំណាក់កាលនេះ passwords គ្រាន់តែជាអត្ថបទធម្មតា ប៉ុន្តែអ្នកនឹងកែប្រែវាទៅប្រើជា bcrypt

ប្រសិនបើពេលនេះអ្នក refresh អ្នកនឹងបាន logged in ហើយ web debug toolbar ក៏ប្រាប់អ្នកថាអ្នកជានរណាហើយអ្នកមានសិទ្ធជាអ្វី៖

ក៏ព្រោះ URL នេះទាមទារនូវ ROLE_ADMIN ប្រសិនបើអ្នក logged in ជា ryan វាអាចនឹង access denied។

ការ load user ពី Database

ប្រសិនបើអ្នកចង់ load users របស់អ្នកតាមរយៈ Doctrine ORM គឺជាការងាយស្រួលណាស់ សូមមើល របៀប Load Security Users ពី Database (Entity Provider) សម្រាប់ការលម្អិត។

គ) ការ Encode នូវ Password របស់ User

មិនថា users របស់អ្នកត្រូវបានរក្សាទុកក្នុង security.yml រឺ ក្នុង database រឺក៏កន្លែងផ្សេង អ្នកនឹងត្រូវការ encode passwords របស់ពូកគេ។ Algorithm ដែលល្អបំផុតនឹងត្រូវប្រើគឺ bcrypt

ពិតណាស់ user’s passwords របស់អ្នកពេលនេះត្រូវធ្វើការ encoded ជាមួយនឹង algorithm ជាក់លាក់មួយ។ សម្រាប់ hardcoded users អ្នកអាចប្រើ built-in command៖

វាអាចនឹងផ្ដល់អោយអ្នកដូចនូវខាងក្រោម៖

អ្វីគ្រប់យ៉ាងនឹងធ្វើការយ៉ាងពិតប្រាកដដូចកាលពីមុន ប៉ុន្តែប្រសិនបើអ្នកមាន dynamic users តើអ្នកអាចនឹងមានវិធីសាស្ត្របែបណាក្នុងការ encode នូវ password មុននឹងធ្វើការបញ្ចូលពួកគេទៅក្នុង database? កុំបារម្ភ សូមមើលទៅលើ របៀបនៃការ Encode នូវ Password ដោយដៃ សម្រាប់លម្អិត។

ឃ) ការ configure បានបញ្ចប់

ពេលនេះជោគជ័យហើយ អ្នកអាចធ្វើការជា authentication system ដែលប្រើប្រាស់ HTTP basic auth និង load users ត្រឹមត្រូវពី security.yml file។

ជំហ៊ានបន្ទាប់របស់អ្នកគឺផ្អែកទៅលើការ setup របស់អ្នក៖

ទី១ configure វិធីផ្សេងគ្នាសម្រាប់ users របស់អ្នកដើម្បី login ដូចជា login form រឺក៏ custom ផ្សេងទៀតដែលបានធ្វើរួចរាល់

ទី២ Load users ពី source ផ្សេងគ្នា ដូចជា database រឺក៏ source មួយចំនួនផ្សេងទៀត

ទី៣ រៀនអំពី deny access, load នូវ User object និងឯកភាពជាមួយនឹង roles ក្នុង Authorization section។