最新消息:文章中包含代码时,请遵守代码高亮规范!

symfony安全组件security的简单研究【原创】

PHP Pota 578浏览 0评论

Symfony的安全系统(security system)是非常强大的,但在设置它时也可能令人迷惑,在之前的symfony学习中看到国外使用较多的fosuserbundle时就提到需要使用到security ,之后看了一段时间奈何因为自己英文水平和技术能力有限没有深入研究,最近又抽空看了下跟着官方文档进行了一些简单的配置。目前使用的是symfony2.8版本若出现不同请看一下版本是否和我相同当然实际测试 3.2使用以下配置时也会达到同样效果。

app/config/security.yml
security:
   firewalls:
       main:
            anonymous: ~
            #此参数必须开启才能使用security 
            http_basic: ~
            #此配置是用于定义自定义登录表单使用
           # form_login:
                #login_path: /login   #自定义登录表单路由 这里先不进行配置
                #check_path: logout
    #    设置哪些路由需要登录验证 
    access_control:
          # require ROLE_ADMIN for /admin*
          - { path: ^/admin, roles: ROLE_ADMIN }

完成以上配置之后创建/admin路由和对应的Controller以及twig模板,在路由中访问/admin/^路由均会被security拦截此时你看到的应该是以下情形

通过官方文档你可以看到若是写入以下配置

app/config/security.yml
    providers:
        in_memory:
            memory:
                users:
                    ryan:
                        password: ryanpass
                        roles: 'ROLE_USER'
                    admin:
                        password: kitten
                        roles: 'ROLE_ADMIN'

这样就在配置文件中添加了两个用户 一个ryan 身份是ROLE_USER 一个是admin 身份是ROLE_ADMIN ,通过之前的配置可以看到^/admin下需要的用户身份为ROLE_ADMIN 此时若是输入ryan登录看到的应该就是Access Denied.错误。
当然在正常项目中不可能每个用户都配置文件中写死此时就需要从第三方加载用户,因为目前symfony项目中数据库都是使用Entity进行管理,且官方提供的导入也是通过Entity进行配置。^/admin路由使用较多的就是项目后台入口路由.首先在项目的Admin.php中

<?php 
namespace BaseBundle\Entity; 

use Symfony\Component\Security\Core\User\UserInterface;//引入接口 
use Doctrine\ORM\Mapping as ORM; 

/**
 * Admin
 *
 * @ORM\Table(name="admin", options={"comment":"管理员表"})
 * @ORM\Entity()
 */
class Admin implements UserInterface, \Serializable//实现接口 
{ 

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */ private $id;

/**
 * @var string
 *
 * @ORM\Column(name="username", type="string", unique=true, length=45, options={"comment":"用户名"})
 */ 
 private $username;

/**
 * @var string
 *
 * @ORM\Column(name="password", type="string", length=40, options={"comment":"密码"})
 */ 
private $password;


 //以下方法必须实现否则无法实现UserInterface, \Serializable 


   public function getUsername() 
    {
         return $this->username;
    }
 
    public function getSalt()
    {
        return null;
    }
 
    public function getPassword()
    {
        return $this->password;
    }
 
    public function getRoles()
    {
        return array('ROLE_USER');
    }
 
    public function eraseCredentials()
    {
    }
 
    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
        ));
    }
 
    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
        ) = unserialize($serialized);
    }
}

你可以在此加入所需的一些其他参数 然后执行

 php app/console doctrine:generate:entities YourBundle/Entity/User
 php app/console doctrine:schema:update --force

然后再配置security.yml以加载你的entity

app/config/security.yml
    encoders:
          #配置安全加载的数据库
          BaseBundle\Entity\Admin:
              algorithm: bcrypt
          Symfony\Component\Security\Core\User\User: plaintext
    providers:
            our_db_provider:
                entity:
                    class: BaseBundle:Admin
                    property: username

    firewalls:
          main:
              provider: our_db_provider

首先,encoders 部分告诉Symfony应预期“数据库中的密码将使用 bcrypt 加密”。第二,providers 部分创建了一个名为 our_db_provider 的“user provider”,它知道从你的 AppBundle:User entity 中利用 username 属性进行查询。our_db_provider 名称并不重要:它仅需匹配firewall下面的 provider 键的值。或者,如果你没在防火墙下设置 provider 键,则自动使用第一个 “user provider”(的键名)。algorithm参数目前支持所有hash_algos()的加密方式
目前还未找到目前在项目中使用的密码加密方式在此配置中的表达方式,当然也不影响使用,在插入新用户是使用以下代码进行手动加密

use BaseBundle\Entity\Admin;

    $user = new Admin();
    $encoder = $this->container->get('security.password_encoder');
    $encoded = $encoder->encodePassword($user, $your_password);

官方文档目前具体登录后认证因为和官方教程走出现无法登录的情况,正在研究,也希望有哪位读者知道原因可以在此告知一下,未完待续……

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/21232.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Pota的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!