2016-12-21 10 views
0

내 REST 응용 프로그램에 대한 FOSOAuthBundle을 사용하고심포니 보안 FOSOAuthServerBundle 공공 및 민간 경로

내가 그러나 나는이

공공 액세스 할 수 있어야하는 몇 가지가 인증을 필요로 내 경로의 대부분을 싶습니다

내 security.yml에 다음과 같은 예를 들어

security: 
encoders: 
    FOS\UserBundle\Model\UserInterface: bcrypt 

role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: ROLE_ADMIN 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username 

firewalls: 
    oauth_token: 
     pattern: ^/login 
     security: false 

    api: 
     pattern: ^/ 
     fos_oauth: true 
     stateless: true 
     anonymous: false 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

:

나는 제품이 EntityController

나는 그래서 Read

를 제외하고 개인이 될하기 위해 CRUD 작업을 싶습니다 GET 공개해야한다 동안 POST, PUT, DELETE on /products(/:id) 개인이어야한다. 나는이 /products의 모든 methods 열 것이라고 생각

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/products$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

하지만 오류 얻을 :

나는하여 access_control에 다음을 추가 시도

{ 
    "error": "access_denied", 
    "error_description": "OAuth2 authentication required" 
} 

내가 가지고있는이 많은 entitiescontrollers 나는 이것을 적용하려고 노력하고있다.

특정 경로 (예 : method 요구 사항 포함)를 여는 방법은 무엇입니까?

답변

0

당신은 정규식 새로운 방화벽을 확인하고 설정할 수 있습니다 (http://symfony.com/doc/current/security.html에서 심포니 문서에서 가져온) 이렇게. 이 정규식을 먼저 일치 시키려면 API 방화벽 앞에 놓아야합니다.

api_anonym_area: 
     pattern: (^/api/products/.*) 
     methods: [GET] 
     security: false 

또는 당신은

api_anonym_area: 
     pattern: (^/api/products/.*) 
     methods: [GET] 
     anonymous: true 

초 경우에 당신이 토큰있을 것이다 당신이 실 거예요, 토큰이 첫 번째 경우에

access_control: 
- { path: ^/api/products/.*, role: IS_AUTHENTICATED_ANONYMOUSLY} 

로 만들 수 있습니다 (그것의 좋은 당신이 인증을 기대하는 또는 익명 사용자).

0

이렇게하려면 가장 좋은 방법은 컨트롤러에서 사용 권한을 코딩하는 것이고, security.yml 구성을 통해 가능하지 않다고 생각합니다.

당신은 제거해야합니다 :

- { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

을 그리고 컨트롤러 액션 내부의 권한을 관리, 예를 들어

public function updateProduct($id) 
{ 
    // The second parameter is used to specify on what object the role is tested. 
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 

    // Old way : 
    // if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { 
    //  throw $this->createAccessDeniedException('Unable to access this page!'); 
    // } 

    // ... 
} 
+0

원하는 경우 주석을 사용하여이를 수행 할 수도 있습니다. '* @Secure (roles = "ROLE_ADMIN")' – JezEmery