php mvc逻辑处理,PHP-在MVC中的哪里实现会话逻辑?

访问我的应用程序(按顺序)

>将IP地址列入白名单

>在无效的IP上重定向到404

>检查上一个活动是否为> 2小时前

>重定向到登录页面并终止会话

>通过查看$_SESSION中的用户数据来检查用户是否已登录

>重定向到登录页面(如果无效)

Index.php

(注意,它与this问题非常相似):

/**

* Set Timezone

*/

date_default_timezone_set('Zulu');

/**

* Include globals and config files

*/

require_once('env.php');

/*

* Closure for providing lazy initialization of DB connection

*/

$db = new Database();

/*

* Creates basic structures, which will be

* used for interaction with model layer.

*/

$serviceFactory = new ServiceFactory(new RepositoryFactory($db), new EntityFactory);

$serviceFactory->setDefaultNamespace('\\MyApp\\Service');

$request = new Request();

$session = new Session();

$session->start();

$router = new Router($request, $session);

/*

* Whitelist IP addresses

*/

if (!$session->isValidIp()) {

$router->import($whitelist_config);

/*

* Check if Session is expired or invalid

*/

} elseif (!$session->isValid()) {

$router->import($session_config);

/*

* Check if user is logged in

*/

} elseif (!$session->loggedIn()) {

$router->import($login_config);

} else {

$router->import($routes_config);

}

/*

* Find matched route, or throw 400 header.

*

* If matched route, add resource name

* and action to the request object.

*/

$router->route();

/*

* Initialization of View

*/

$class = '\\MyApp\\View\\' . $request->getResourceName();

$view = new $class($serviceFactory);

/*

* Initialization of Controller

*/

$class = '\\MyApp\\Controller\\' . $request->getResourceName();

$controller = new $class($serviceFactory, $view);

/*

* Execute the necessary command on the controller

*/

$command = $request->getCommand();

$controller->{$command}($request);

/*

* Produces the response

*/

echo $view->render();

$router-> import()函数获取具有路由配置的json文件并创建路由(尚未决定是否要保留该路由).我的路由器是Klein的修改版.

我的问题

这是如何检查会话数据的正确实现吗?

我希望检查会话中的用户数据是否可以在数据库中找到,但是我需要为此使用Service,并且Services应该仅由controller(?)访问.我不知道将用户发送到哪个控制器,因为如果用户登录,则路由配置会更改.

例如,如果有人试图访问www.myapp.com/orders/123,则如果有人登录,我会将其发送到Orders控制器,如果不是,则将其发送到Session控制器(以呈现登录页面). .

我已经阅读了从this开始的ACL实施问题.但是,除非我弄错了,否则这是为了控制已登录用户的访问权限,而不是未登录用户的访问权限.如果不是这种情况,请有人说明我将如何实现我的ACL检查这个?

我非常感谢您的帮助,因为对这个答案的搜索给了我真正混合的解决方案,并且其中大多数我都不喜欢或者看起来不干净.就像会话管理器一样,这基本上是我正在做的事情,但假装不这样做. = /

更新index.php(我的解决方案)

/**

* Set Timezone

*/

date_default_timezone_set('Zulu');

/**

* Include globals and config files

*/

require_once('env.php');

/*

* Closure for providing lazy initialization of DB connection

*/

$db = new Database();

/*

* Creates basic structures, which will be

* used for interaction with model layer.

*/

$serviceFactory = new ServiceFactory(new MapperFactory($db), new DomainFactory);

$serviceFactory->setDefaultNamespace('\\MyApp\\Service');

include CONFIG_PATH.'routes.php';

$request = new Request();

$router = new Router($routes,$request);

/*

* Find matched route.

*

* If matched route, add resource name

* and command to the request object.

*/

$router->route();

$session = $serviceFactory->create('Session');

/*

* Whitelist Ip address, check if user is

* logged in and session hasn't expired.

*/

$session->authenticate();

/*

* Access Control List

*/

include CONFIG_PATH.'acl_settings.php';

$aclFactory = new AclFactory($roles,$resources,$rules);

$acl = $aclFactory->build();

$user = $session->currentUser();

$role = $user->role();

$resource = $request->getResourceName();

$command = $request->getCommand();

// User trying to access unauthorized page

if (!$acl->isAllowed($role, $resource, $command) {

$request->setResourceName('Session');

$request->setCommand('index');

if ($role === 'blocked') {

$request->setResourceName('Error');

}

}

/*

* Initialization of View

*/

$class = '\\MyApp\\View\\' . $request->getResourceName();

$view = new $class($serviceFactory, $acl);

/*

* Initialization of Controller

*/

$class = '\\MyApp\\Controller\\' . $request->getResourceName();

$controller = new $class($serviceFactory, $view, $acl);

/*

* Execute the necessary command on the controller

*/

$command = $request->getCommand();

$controller->{$command}($request);

/*

* Produces the response

*/

$view->{$command}

$view->render();

我开始会话并在会话模型中授权用户.如果未登录,会话的currentUser将具有“来宾”的角色,如果其IP地址不在白名单中,则将具有“阻止”的角色.我想按照Teresko先前的ACL帖子中的建议实现Controller包装器,但是我需要一些可以重定向用户的包装器.如果他们尝试访问不允许访问的页面,我会将其发送到其主页(Session#index),如果被阻止,则将其发送到Error#index. Session#index将使View决定是否显示已登录用户的主页,如果未登录则显示登录页面(通过检查用户角色).也许不是最好的解决方案,但似乎并不可怕.

解决方法:

单一责任

您的会话对象正在做太多事情.会话或多或少只是为了保持请求之间的持久性.会话不应执行任何身份验证逻辑.您在会话中存储了登录用户的标识符,但是实际的验证,登录/注销应在身份验证服务中完成.

路线管理

根据用户身份验证状态导入不同的路由将无法很好地扩展,并且当您有更多的路由时,以后进行调试将很麻烦.最好在一个地方定义所有路由,并使用身份验证服务进行重定向(如果未授权).我对那个路由器不是很熟悉,但是通过查看文档,您应该可以

$router->respond(function ($request, $response, $service, $app) {

$app->register('auth', function() {

return new AuthService();

}

});

然后在您需要登录的路线上,您可以执行以下操作

$router->respond('GET', '/resource', function ($request, $response, $service, $app) {

if( ! $app->auth->authenticate() )

return $response->redirect('/login', 401);

// ...

});

标签:model-view-controller,architecture,session,php

来源: https://codeday.me/bug/20191120/2043983.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值