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

កាលពីអត្ថបទមុន យើងបានរៀបរាប់អំពី ការស្វែងយល់អំពី Security នៅក្នុង Symfony3 ហើយចំណែកឯអត្ថបទនេះវិញ ក៏នៅតែនិយាយអំពី Security នៅក្នុង Symfony3 ដូចគ្នាតែយើងបន្តពីអត្ថបទមុន។

២)​ ធ្វើការដាក់ access denied ទៅកាន់ app (authorization)

Users ពេលនេះអាច login ទៅកាន់ app ដោយប្រើប្រាស់ http_basic រឺក៏ method ផ្សេងទៀត។ ពេលនេះអ្នកត្រូវរៀនពី deny access និងធ្វើការជាមួយ User object។ នេះហៅថា authorization ហើយមុខងាររបស់វាគឺ សម្រេចថាប្រសិនបើ user អាច access ទៅកាន់ប្រភពមួយចំនួន (URL, model object, method call, …)

ដំណើរការនៃ authorization មាន២សណ្ឋានផ្សេងគ្នា៖

ទី១៖ user ទទួលនូវការកំណត់ roles ជាក់លាក់ពេលដែលកំពុង loggin

ទី២៖ អ្នកត្រូវបន្ថែមកូដដូចនេះប្រភព (URL, controller) ទាមទារនូវ “attribute” ជាក់លាក់ក្នុងការ access

ក) Roles

ពេល user logs in ពួកគេនឹងទទួលនឹងការកំណត់ roles (ROLE_ADMIN)។ ក្នុងឧទាហរណ៏ខាងលើ ទាំងនោះគឺ​​ hardcoded ទៅក្នុង security.yml។ ប្រសិនបើអ្នកកំពុង load users ពី database ពួកវាអាចនឹងត្រូវរក្សាទុកនូវលើ column ក្នុង table របស់អ្នក។

អ្នកក៏អាចបញ្ជាក់នូវ role hierarchy កន្លែងដែល roles មួយចំនួនមានលក្ខណៈស្វ័យប្រវត្តិ មានន័យថាអ្នកក៏អាចមានសិទ្ធផ្សេងទៀតផងដែរ។

ខ) បន្ថែមកូដទៅជា Deny Access

មាន២វិធីដើម្បី deny access ទៅអ្វីផ្សេងៗ៖

ទី១៖ access_control ក្នុង security.yml អនុញ្ញាតអោយអ្នកការពារ URL patterns ។ វាមានភាពងាយស្រួលតែមានភាពបត់បែនតិចតួច។

ទី២៖ នៅក្នុងកូដតាមរយៈ security.authorization_checker service

គ) ការធ្វើអោយសុវត្ថិភាពនូវ URL patterns (access_control)

វិធីដែលសាមញ្ញក្នុងការធ្វើអោយ application មានសុវត្ថិភាពគឺ ធានាទៅលើ URL pattern ទាំងមូល។ អ្នកបានឃើញពីវគ្គមុន កន្លែងដែលអ្វីផ្សេងផ្គូរផ្គងទៅនឹង regular expression ^/admin ទាមទារនូវ​ role ជា ROLE_ADMIN

នេះជាវិធីល្អណាស់សម្រាប់ធានានូវ sections ទាំងមូល ប៉ុន្តែអ្នកនឹងប្រហែលជាត្រូវការ ធានានូវ controllers ជាលក្ខណៈផ្ទាល់ខ្លួន

អ្នកអាចកំណត់ជា URL patterns ជាច្រើនតាមដែលត្រូវការដោយ URL patterns នីមួយៗគឺជា regular expression។ ប៉ុន្តែ មានតែមួយគត់ដែលត្រូវគ្នា។ Symfony នឹងមើលទៅលើ ការចាប់ផ្ដើមដំបូងបំផុត និងបញ្ឈប់បំផុតបើវារកឃើញនូវ access_control បញ្ចូលទៅត្រូវគ្នាជាមួយនឹង URL។

ឃ) ការធានានូវ Controllers និងកូដផ្សេងទៀត

អ្នកអាច deny access ពីខាងក្នុង controller បានយ៉ាងងាយស្រួល៖

ក្នុងការងារទាំងពីរនេះ AccessDeniedException គឺត្រូវបដិសេធចោល ដែលចុងក្រោយជាការឆ្លើយតបជា 403 HTTP response នៅក្នុង Symfony។

ង) Access Control ក្នុង Templates

ប្រសិនបើអ្នកចង់ពិនិត្យថា current user មាន​ role ខាងក្នុង​ template សូមប្រើ built-in is_granted() helpter function៖

ច) ធ្វើការពិនិត្យមើលថា User គឺបាន Logged in (IS_AUTHENTICATED_FULLY)

ពីមុនអ្នកបានពិនិត្យលើ access ផ្អែកទៅលើ roles ហើយ strings ដែលចាប់ផ្ដើមជាមួយ ROLE_ និងបានផ្ដល់ដោយ​ users។ ប៉ុន្តែបើអ្នកគ្រាន់តែចង់ពិនិត្យថថា user គឺបាន logged in នោះអ្នកអាចប្រើ IS_AUTHENTICATED_FULLY

៣) ធ្វើការចាប់យកនូវ User object

បន្ទាប់ពី authentication គឺ User object នៃ current user អាចនឹង​ accessed តាមរយៈ security.token_storage service។ ពីខាងក្នុង controller វាអាចនឹងដូចរូបភាពខាងក្រោម៖

ពេលនេះអ្នកអាចហៅ method ណាក៏បានគឺស្ថិតនៅលើ User object របស់អ្នក។ ឧទាហរណ៏ប្រសិនបើ User object របស់អ្នកមាន getFirstName() method អ្នកគួរតែប្រើ៖

ជាចុងក្រោយ ផ្នែកដែលពិបាកជាងគេគឺពេលដែលអ្នកធ្វើការ custom នូវតម្រូវការ ដូចជា custom authentication strategy (API tokens) authorization logic ដែលមានលក្ខណៈស្មុគស្មាញ និង រឿងជាច្រើនទៀត។