Symfony内置的权限属性-Symfony5全面开发

您需要登录后才可观看此视频

为了更好的为您提供服务,请您登录后再查看本课程。

立即登录 注册账号

我们搜索symfony security,查看Symfony的安全文档,往下看。这里有段是关于用户是否已经登录的文档,我们点击这里,如果你只想检查用户是否已经登录了,并不关心用户的角色。我们有两种方法,第一种方法是检查ROLE_USER这个角色,因为所有的用户都有ROLE_USER角色。

另外一种方法可以使用一个特殊的属性,叫作IS_AUTHENTICATED_FULLY。这个属性它不是一个角色,它更像是一种行为。所有(使用账号密码)已经登录过的用户都有这个属性,我们可以通过检查这个属性来判断用户是否已经登录。

另外还有一些其他的属性,比如说IS_AUTHENTICATED_REMEMBERED,这个属性是通过勾选记住我(Remember me)选项,自动登录的用户会有这个属性,通过勾选记住我选项登录的只有IS_AUTHENTICATED_REMEMBERED这个属性,但是没有IS_AUTHENTICATED_FULLY这个属性。通过账号密码登录的有IS_AUTHENTICATED_FULLY这个属性。

然后是IS_AUTHENTICATED_ANONYMOUSLY,所有的用户都有这个属性,包括未登录的用户都有这个属性。

在5.1版本开始新增了三个属性,IS_ANONYMOUS只有匿名的用户有这个属性。IS_REMEMBERED只有勾选记住我选项自动登录的用户拥有这个属性。我们看最后一个,如果当前的用户是模拟的另一个用户,那么就会有这个属性。复制IS_AUTHENTICATED_FULLY这个属性。

回到项目,我们修改一下nav.html.twig文件。复制一行添加注释,这里修改一下。我们使用is_granted(),参数这里传入IS_AUTHENTICATED_FULLY

回到浏览器刷新首页,我们再次进行登录。我们再次回到首页,现在我们的用户信息就显示了出来,和之前显示的效果一样。我们在开发关于权限的功能时,通常需要切换账号测试不同的功能,你需要来回的退出一个账号,然后登录另一个账号。Symfony为我们提供了另外一种更快速的方法。

回到项目,我们打开security.yaml配置文件。在main防火墙下,有个switch_user配置,我们取消行前的注释。将switch_user设置为true。我们先来查看一下switch_user的文档,复制链接,粘贴访问。

通过switch_user配置,我们可以模拟另外一个用户登录,我们需要在访问的地址后面添加_switch_user请求参数,参数的值就是另外一个用户的标识符。通常使用配置文件中provider配置的属性,这里使用的是用户名。

继续往下看,我们需要为使用这个功能的用户添加ROLE_ALLOWED_TO_SWITCH这个角色属性。通常是用角色继承是个好的办法,角色继承我们在后面课程会讲到。在这里我们为管理员用户添加这个角色属性,复制属性的名称。回到项目,我们打开Fixtures文件,我们为admin用户添加这个属性。

重置数据库,重置完数据库,回到浏览器,刷新博客首页。现在我们登录一下超级管理员用户,点击登录。再次返回首页,我们的管理员用户已经登录了。我们在链接后面添加下_switch_user=tom来模拟tom用户。现在我们看tom用户已经登录了。通过这种方法我们可以快速的切换账户。

继续查看文档,我们往下看,tom用户现在是模拟的用户,那么tom用户就会有这个属性(不会读这个单词)。我们可以通过这个属性的判断添加一个退出模拟用户的链接。我们复制一下代码,回到项目,打开nav.html.twig文件。在菜单后面我们粘贴代码,首页地址我们修改一下,修改为index。

回到浏览器刷新首页,现在tom用户后面就添加了退出模拟用户的链接。我们点击链接,就自动返回了admin用户。回到项目,我们打开管理端controller,打开DashboardController,DashboardController继承自AbstractDashboardController

我们查看父类,父类它继承于AbstractController,我们再查看AbstractController。查看一下类中所有的方法,在AbstractController中有个getUser()方法,我们可以通过getUser()方法来获取当前已登录的用户。在getUser()方法中首先会通过容器获取Token服务类对象,再通过$token获取用户对象进行返回。

我们还可以通过使用依赖注入的方式,在服务类中或者controller方法中获取当前的用户。我们打开PostController,在index()方法中,我们先来使用父类提供的方法来获取当前的用户,输入$user = $this->getUser()。使用dd查看$user。回到浏览器刷新首页,我们当前的用户就显示了出来。

再次回到项目,我们通过依赖注入的方式注入Security对象,这里选择安全系统下的Security类型。通过Security对象的getUser()方法,我们来获取$user对象。回到浏览器再次刷新,同样的我们获取到了用户对象。

我们可以使用这两种方法,在controller方法中获取当前的用户对象。如果要在服务类中获取用户对象,我们可以在服务类的构造方法中注入Security对象,通过Security对象来获取用户。

在下节课,我们来增加一些用户的角色,并且学习一下角色的继承。

课程讨论

当前内容评论功能已关闭。