Silex 安全提供商

2024-04-11

我有课UserMapper

<?php

namespace Models;

use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use \PDO;


class UserMapper implements UserProviderInterface
{
/**
* Database connection.
*/
var $db = NULL;


/**
* Constructor function. Loads model from database if the id is known.
*
* @param $db
*   Database connection
*/
function __construct() {    
    $this->db = ConnectionProvider::getConnection();
}


function save(User $user) {
    $statement = $this->db->prepare('INSERT INTO user (username, password, salt, roles) VALUES (:username, :password, :salt, :roles)');
    foreach (array('username', 'password', 'salt', 'roles') as $property) {
        $placeholders[':' . $property] = $user->get($property);
    }
    $isOk = $statement->execute($placeholders);        
    return $isOk;
}


public function findByUsername($username) {
    $statement = $this->db->prepare('SELECT * FROM user WHERE username = :username');
    $statement->execute(array(':username' => $username));
    $data = $statement->fetch(PDO::FETCH_ASSOC);
    if($data['username'] == null)
        return null;
    else {
        $user = new User($data['username'], $data['salt'], $data['roles']);
        $user->set('password', $data['password']);
        return $user;
    }
}

function loadAll() {

    // Query for the existing users.
    $statement = $this->db->query('SELECT * FROM user');
    $results = $statement->fetchAll(PDO::FETCH_ASSOC);

    // Format the list and output it as JSON.
    $data = array();
    foreach ($results as $result) {
        $user = new User($result['username'], $result['salt'], $result['roles']);
        $user->set('passwort', $result['password']);

        $data[] = $user;
    }

    return $data;
  }

    /**
   * Delete this user.
   */
  function delete(User $user) {
    if ($user->get('username')) {
      // Execute the delete query.
      $statement = $this->db->prepare('DELETE FROM user WHERE username = :username');
      $statement->execute(array(':username' => $user->get('username')));
    }
  }

  /// UserProviderInterface
  public function loadUserByUsername($username)
  {
    $user = $this->findByUsername($username);

    if($user == null)
        throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));

    return $user;
  }

  public function refreshUser(UserInterface $user)
  {
    if (!$user instanceof User) {
        throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
    }

    return $this->loadUserByUsername($user->getUsername());
  }

  public function supportsClass($class)
  {
    return $class === 'Models\User';
  }
  }

和我的班级User

<?php

namespace Models;

use Symfony\Component\Security\Core\User\UserInterface;

class User implements UserInterface{

var $username = NULL;
var $password = NULL;
var $salt = NULL;
var $roles = NULL;

function __construct($username, $password, $sal, $roles) { 
$this->username = $username;
$this->password = $password;  
$this->salt = $salt;  
$this->roles = $roles; 
}

function getUsername() {
return $this->username;
}

function getRoles() {
return $this->salt;
}

function getSalt() {
return $this->roles;
}

function getPassword() {
return $this->password;
}

function eraseCredentials() {
}

function get($property) {
if (!empty($this->{$property})) {
  return $this->{$property};
}
else {
  return false;
}
}

function set($property, $value) {
$this->{$property} = $value;
}

function getAll() {
return array(
  'username' => $this->get('username'),
  'password' => $this->get('password'),
  'salt' => $this->get('salt'),
  'roles' => $this->get('roles')
);
}
}

而在我的index.php我这样配置安全上下文:

$app['security.firewalls'] = array(
'secured' => array(
    'pattern'    => '^/',
    'anonymous'  => array(),
    'form' => array(
        'login_path' => 'login', 
        'check_path' => 'login_check'
    ),
    'users' => $app->share(function () use ($app) {
        return $app['UserMapper'];
    }),
)
);

$app['security.access_control'] = array(
array('path' => '^/login', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
array('path' => '^/', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
array('path' => '^/comment', 'methode' => 'POST', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
array('path' => '^/comment', 'methode' => 'DELETE', 'role' => 'ROLE_ADMIN'),
array('path' => '^/location', 'methode' => 'GET, POST', 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY'),
array('path' => '^/location', 'methode' => 'PUT, DELETE', 'role' => 'ROLE_ADMIN')    
);

$app['security.provider'] = array(
'users' => array(
    'entity' => array('class' => 'Models\User', 'property' => 'username')
)
);

 $app['security.encoders'] = array(
'Models\User' => array(
    'algorithm' => 'bcrypt',
)
);

$app->register(new UrlGeneratorServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => $app['security.firewalls'],
'security.access_control' => $app['security.access_control'],
'security.provider' => $app['security.provider'],
'security.encoders' => $app['security.encoders'],
));

问题是,当我使用数据库中不存在的 foo 登录名和 foo 密码提交登录表单时,安全上下文会为我创建一个会话。

安全提供商出了什么问题?


security.access_control没有定义在Silex\Provider\SecurityServiceProvider。我相信应该是security.access_rules:

$app['security.access_rules'] = array(
    array('^/admin', 'ROLE_ADMIN'),

);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Silex 安全提供商 的相关文章

  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • 如何确定当前使用哪个网格选项

    我将 Bootstrap 3 用于使用 PHP 和 HTML 创建的网页 随着响应式网格和类的开启引导程序3您可以将多个类分配给一个 div 以根据当前屏幕尺寸定义不同的宽度 例如 div class col lg 3 col md 3 c
  • 如何调试symfony2服务容器中配置的标签和服务?

    我正在编写一个服务来处理 AccessDeniedException 并且我找到了一种方法来解决它使用 Symfony2 的 AccessDeniedHandlerInterface https stackoverflow com ques
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • PHP、jQuery 和 Ajax 调用乱序

    我正在使用 jQuery 进行 Ajax 调用 我有 x 数量的 Ajax 调用附加到 div 这些 Ajax 加载请求是由 PHP foreach 循环生成的 问题是它们渲染的顺序不正确 它们被设置在数组中
  • 限制对记录的访问。基于声明的权限是个好主意吗

    在 net 基于声明的身份框架中 如果我想限制用户对某个帐户 特定帐户 123456 执行操作 查看或编辑 我说的是商业实体 例如银行帐户 创建索赔是个好主意吗对于他们可以查看或编辑的每个帐户 一组中有很多索赔有什么缺点吗 系统管理员可能有
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 如何在 Twitter Card 中传递动态图像路径?

    我在用
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • PHP:在脚本完成之前获取输出

    我有一个名为 data php 的脚本 如下所示 do some stuff echo result do some other stuff eg database operations 我需要在另一个脚本中使用 data php 的输出
  • Symfony2 自定义密码编码器(bcrypt)

    我已经编写了自己的密码编码器 它实现了PasswordEncoderInterface class BCryptPasswordEncoder implements PasswordEncoderInterface protected en
  • magento成功页面变量

    我正在尝试捕获一些 magento 成功页面变量以传递给我们的广告公司 到目前为止 我已经得到了这个 但变量没有输出任何内容 数据需要采用以下格式 price1 price2 price3 qty1 qty2 qty3 sku1 sku2
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • HTML 代码中的 PHP [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我用 HTML 代码编写了 PHP div div 但这出现在输出页面中 else print 我怎样才能让PHP执行 你的文件有一个 p
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏

随机推荐