我正在使用FOSOAuthBundle作为我的REST应用程序
我希望我的大部分路线都需要授权,但有一些路线需要公开访问
我的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 ] }
例如:
我有一个产品Entity
和Controller
除了CRUD
Read
操作是私有的
因此:POST, PUT, DELETE on /products(/:id)
应该是私有的,而GET
应该是公开的。
我尝试将以下内容添加到access_control:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/products$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] }
我认为这会打开methods
上的所有/products
但我收到错误:
{
"error": "access_denied",
"error_description": "OAuth2 authentication required"
}
我有很多entities
和controllers
我正在尝试将此应用于。
我如何开放特定路线(包括method
要求)?
答案 0 :(得分:0)
要实现这一点,最好的办法是对控制器中的权限进行编码,我认为这不可能通过security.yml配置实现。
你应该删除:
- { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] }
管理控制器操作中的权限,例如(取自http://symfony.com/doc/current/security.html的symfony文档)
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!');
// }
// ...
}
答案 1 :(得分:0)
您可以使用正则表达式创建新防火墙并将其设置为这样。你必须把它放在你的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}
在第一种情况下,你没有令牌,在第二种情况下,你将拥有令牌(当你期望经过身份验证或匿名用户时,它会很好。)