Routing Symfony多址\u拒绝\u url
我试图使用Symfony框架限制对某些路由的访问。 目前我的Routing Symfony多址\u拒绝\u url,routing,symfony,Routing,Symfony,我试图使用Symfony框架限制对某些路由的访问。 目前我的security.yml文件中有以下内容: access_control: - { path: ^/admin, roles: ROLE_ADMIN } - { path: ^/my/account, roles: ROLE_USER } - { path: ^/my, roles: ROLE_ACTIVE } 当用户未登录并尝试访问其中一个帐户页面时,他们将被重定向到登录页面-这是正确的 当用户登录并尝试访问
security.yml
文件中有以下内容:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/my/account, roles: ROLE_USER }
- { path: ^/my, roles: ROLE_ACTIVE }
当用户未登录并尝试访问其中一个帐户页面时,他们将被重定向到登录页面-这是正确的
当用户登录并尝试访问其中一个帐户页面,但其帐户未激活(即,他们没有激活角色角色\u
),则会将其重定向到激活页面-这是正确的。
我发现以下几点实现了这一点:
firewalls:
default:
...
access_denied_url: activate
但是,现在由于访问被拒绝\u url:activate
当登录用户尝试访问^/admin
而他们不是管理员(即,他们没有角色角色\u admin
)时,他们被重定向到激活
页面。相反,我想将它们重定向到myu主页
页面。我怎样才能做到这一点
或者,我可以满足于显示未授权页面,但如果我将@安全(“has_role('role_ADMIN'))
添加到我的管理控制器,并从访问控制
中删除{path:^/ADMIN,roles:role_ADMIN}
,它会执行相同的操作,即重定向到激活页面
整个security.yml
文件供参考:
security:
encoders:
AppBundle\Entity\Account:
algorithm: bcrypt
providers:
in_memory:
memory: ~
our_db_provider:
entity:
class: AppBundle:Account
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin:
pattern: ^/admin
access_denied_url: my_homepage
anonymous: ~
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: my_homepage
default:
anonymous: ~
remember_me:
secret: '%secret%'
# Expire in 30 days
lifetime: 2592000
path: /
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: login
access_denied_url: activate
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/my/account, roles: ROLE_USER }
- { path: ^/my, roles: ROLE_ACTIVE }
为与
^/admin
模式匹配的URL创建特定防火墙:
admin:
pattern: ^/admin
access_denied_url: my_homepage
# ...
编辑
您需要在两个防火墙之间共享相同的上下文
:
admin:
pattern: ^/admin
context: default
access_denied_url: my_homepage
anonymous: ~
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: login
请注意,我将登录路径
更改为与默认防火墙相同的路径
并将同一行添加到默认值中:
default:
anonymous: ~
context: default
remember_me:
secret: '%secret%'
# Expire in 30 days
lifetime: 2592000
path: /
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: login
access_denied_url: activate
用这些防火墙替换你的防火墙,它应该能正常工作
为与^/admin
模式匹配的URL创建特定防火墙:
admin:
pattern: ^/admin
access_denied_url: my_homepage
# ...
编辑
您需要在两个防火墙之间共享相同的上下文
:
admin:
pattern: ^/admin
context: default
access_denied_url: my_homepage
anonymous: ~
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: login
请注意,我将登录路径
更改为与默认防火墙相同的路径
并将同一行添加到默认值中:
default:
anonymous: ~
context: default
remember_me:
secret: '%secret%'
# Expire in 30 days
lifetime: 2592000
path: /
logout:
path: /logout
target: /
provider: our_db_provider
simple_form:
authenticator: login_authenticator
check_path: login
login_path: login
access_denied_url: activate
用这些防火墙替换你的防火墙,它应该能正常工作
我试过了,但我得到了一个错误:SecurityExtension.php第435行中的InvalidConfigurationException:没有为防火墙“admin”注册身份验证侦听器。
您需要以与您的默认值
防火墙相同的方式添加配置(即登录表单
和其他强制参数)。我没有默认防火墙的配置,也无法为您复制。只需复制第一个并更改模式
和访问被拒绝的url
我认为,因此我添加了与默认完全相同的内容(除了访问被拒绝的url明显不同),而不是重定向到它重定向到登录的激活路由。您使用哪个角色访问该路由?如果他没有被认证,这是预期的行为。否则,将登录路径
更改为我的主页
。将登录路径
更改为我的主页
会奏效。谢谢我以为我以前试过了,但它出错了。奇怪。我正在测试的用户已登录,但没有角色\u ADMIN
角色,因为我正在测试以确保非管理员用户无法访问管理员区域并重定向到主用户主页。不确定为什么默认行为是重定向到登录,尽管他们已登录,只是没有使用正确的角色进行授权。我尝试了这样做,但我得到一个错误:InvalidConfigurationException in SecurityExtension.php第435行:没有为防火墙“admin”注册身份验证侦听器.
您需要以与默认防火墙相同的方式添加配置(即登录表单
和其他必需参数)。我没有默认防火墙的配置,也无法为您复制。只需复制第一个并更改模式
和访问被拒绝的url
我认为,因此我添加了与默认完全相同的内容(除了访问被拒绝的url明显不同),而不是重定向到它重定向到登录的激活路由。您使用哪个角色访问该路由?如果他没有被认证,这是预期的行为。否则,将登录路径
更改为我的主页
。将登录路径
更改为我的主页
会奏效。谢谢我以为我以前试过了,但它出错了。奇怪。我正在测试的用户已登录,但没有角色\u ADMIN
角色,因为我正在测试以确保非管理员用户无法访问管理员区域并重定向到主用户主页。不确定为什么默认行为是重定向到登录,尽管他们已登录,只是没有获得正确角色的授权。