我是symfony的新手,所以我需要你的帮助。我的安全问题出了问题。阳明海运。我尝试制作一个小应用程序,将一些数据存储在我的数据库中,并在我的主页上显示。它工作得很好,但改变了route.yml:
的路由addlink:
path: /addlink
defaults: { _controller: ExerciseLinkBundle:Exercise:addLink }
到
addlink:
path: /secured_area/addlink
defaults: { _controller: ExerciseLinkBundle:Exercise:addLink }
导致重定向到我的登录网站。如下所示,我显然不知道我在security.yml中做了什么。请告诉我如何重定向到我的' addlink'路线。正如我所提到的,它使用第一个路径工作正常,因此控制器/模板必须正常。
login_firewall:
pattern: ^/secured_area/login$
anonymous: ~
exercise:
pattern: ^/secured_area
form_login:
csrf_provider: form.csrf_provider
login_path: /secured_area/login
check_path: /secured_area/login_check
always_use_default_target_path: true
default_target_path: /secured_area/addlink
logout:
path: /secured_area/logout
target: /
请不要告诉我有关FOSUserBundle的同时我会使用这个,但这个必须先完成:)。所以请帮助我离开那里。
答案 0 :(得分:1)
security.yml
中的防火墙配置为保护以^/secured_area
开头的每个网址。这意味着,如果有人试图访问http://yoursite.dev/secured_area/addlink之类的网址,防火墙会截取此信息,并确保用户有权查看该网页。重定向到您的登录的原因是,在防火墙确定用户是否有权查看该页面之前,必须对用户进行身份验证。与授权用户登录后,您将被重定向到初始页面(/ secured_area / addlink)。看起来您正在保护/login_check
网址,这意味着您永远无法登录。
我认为创建防火墙的方式不那么令人困惑。尝试这样的事情:
firewalls:
exercise:
pattern: ^/
form_login:
csrf_provider: form.csrf_provider
login_path: /login
check_path: /login_check ### there is not reason to secure this URL
always_use_default_target_path: true
default_target_path: /secured_area/addlink
logout:
path: /secured_area/logout
target: /
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/secured_area, role: IS_AUTHENTICATED_REMEMBERED }
- { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY }
这将产生类似的效果,但更清晰,更容易看到发生了什么。首先,使用这种方法,如果您愿意,您仍然可以拥有一些公共页面。其次,您的登录_检查'不需要身份验证(我认为这是您所看到的主要问题的一部分)。最后,通过此配置,您的整个站点将通过此防火墙。这并不意味着您的整个站点都将受密码保护,这只意味着您可以指定(在security.yml的access_control部分中)未经身份验证的用户可以查看哪些页面以及经过身份验证的用户可以查看哪些页面。
有关保护您网站的更多信息,请阅读Authorization section of the Symfony security docs它有很多好消息。