Welcome Guest, Not a member yet? Register   Sign In
Filters dont work
#1

(This post was last modified: 08-30-2020, 01:08 AM by pippuccio76.)

This is my route
Route 
PHP Code:
$routes->add('/user/login''User::login',['filter'=>'usersFiltersNoAuth']);
$routes->add('/login''User::login',['filter'=>'usersFiltersNoAuth']);
$routes->add('/user/registration''User::registration',['filter'=>'usersFiltersNoAuth']);
$routes->add('/logout''User::logout');
$routes->add('/user/changeEmail''User::changeEmail',['filter'=>'usersFiltersAuth']);
$routes->add('/user/changePassword''User::changePassword',['filter'=>'usersFiltersAuth']); 


Filter class :

PHP Code:
class UsersFiltersNoAuth implements FilterInterface
{
    /**
     * Do whatever processing this filter needs to do.
     * By default it should not return anything during
     * normal execution. However, when an abnormal state
     * is found, it should return an instance of
     * CodeIgniter\HTTP\Response. If it does, script
     * execution will end and that Response will be
     * sent back to the client, allowing for error pages,
     * redirects, etc.
     *
     * @param \CodeIgniter\HTTP\RequestInterface $request
     * @param array|null                         $params
     *
     * @return mixed
     */
    public function before(RequestInterface $request$params null)
    {
        // if no user is logged in then send them to the login form
        if (isset($_SESSION['user_id']))
        {
                        
            
return redirect()->to('/user/index');
        }
    }

    //--------------------------------------------------------------------

    /**
     * Allows After filters to inspect and modify the response
     * object as needed. This method does not allow any way
     * to stop execution of other after filters, short of
     * throwing an Exception or Error.
     *
     * @param \CodeIgniter\HTTP\RequestInterface  $request
     * @param \CodeIgniter\HTTP\ResponseInterface $response
     * @param array|null                          $arguments
     *
     * @return void
     */
    public function after(RequestInterface $requestResponseInterface $response$arguments null)
    {

    }

    //--------------------------------------------------------------------

}   // End of YourFilterName Class. 

PHP Code:
class UsersFiltersAuth implements FilterInterface
{
    /**
     * Do whatever processing this filter needs to do.
     * By default it should not return anything during
     * normal execution. However, when an abnormal state
     * is found, it should return an instance of
     * CodeIgniter\HTTP\Response. If it does, script
     * execution will end and that Response will be
     * sent back to the client, allowing for error pages,
     * redirects, etc.
     *
     * @param \CodeIgniter\HTTP\RequestInterface $request
     * @param array|null                         $params
     *
     * @return mixed
     */
    public function before(RequestInterface $request$params null)
    {
        // if no user is logged in then send them to the login form
        if (!isset($_SESSION['user_id']))
        {
            
            session
()->set('redirect_url'current_url());
            
            
return redirect()->to('/login');
        }
    }

    //--------------------------------------------------------------------

    /**
     * Allows After filters to inspect and modify the response
     * object as needed. This method does not allow any way
     * to stop execution of other after filters, short of
     * throwing an Exception or Error.
     *
     * @param \CodeIgniter\HTTP\RequestInterface  $request
     * @param \CodeIgniter\HTTP\ResponseInterface $response
     * @param array|null                          $arguments
     *
     * @return void
     */
    public function after(RequestInterface $requestResponseInterface $response$arguments null)
    {

    }

    //--------------------------------------------------------------------

}   // End of YourFilterName Class. 


if i try to go to /user/chengeEmail or /user/changePassword when ($_SESSION['user_id] is set) i am redirect to /user/index why ?
Reply
#2

my filters are working for different purposes but i'm using it different . I don't put filter in route


At : /var/www/htdocs/appstarter/app/Filters

//i have my classes

├── MyFilter.php
├── MyFilter10.php
├── MyFilter2.php
├── MyFilter3.php
├── MyFilter4.php
├── MyFilter5.php
├── MyFilter6.php
├── MyFilter7.php
├── MyFilter8.php
└── MyFilter9.php


eg
Code:
<?php namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;


class MyFilter implements FilterInterface
{
        public function before(RequestInterface $request, $arguments = null)
        {
            session_start();
    
           $logic=isset($_SESSION['role']) ;
           if($logic==false)
           {
            return redirect('spam');
  
           }
then in app/Config/Filters.php


Code:
<?php namespace Config;

use CodeIgniter\Config\BaseConfig;

class Filters extends BaseConfig
{
    // Makes reading things below nicer,
    // and simpler to change out script that's used.
    public $aliases = [
        'csrf'     => \CodeIgniter\Filters\CSRF::class,
        'toolbar'  => \CodeIgniter\Filters\DebugToolbar::class,
        'honeypot' => \CodeIgniter\Filters\Honeypot::class,
        'myfilter'=> \App\Filters\MyFilter::class,
        'myfilter2'=> \App\Filters\MyFilter2::class,
        
        
        
    ];

    // Always applied before every request
    public $globals = [
        'before' => [
            //'honeypot'
            // 'csrf',
        ],
        'after'  => [
            'toolbar',
            //'honeypot'
        ],
    ];

    // Works on all of a particular HTTP method
    // (GET, POST, etc) as BEFORE filters only
    //     like: 'post' => ['CSRF', 'throttle'],
    public $methods = [];

    // List filter aliases and any before/after uri patterns
    // that they should run on, like:
    //    'isLoggedIn' => ['before' => ['account/*', 'profiles/*']],
    public $filters = [
    
    
    'myfilter' => ['before' => ['newblog']],
    'myfilter9' => ['before' => ['admin']],
//etc
    
    
    ];
}
Reply
#3

(08-30-2020, 03:33 AM)captain-sensible Wrote: my filters are working for different purposes but i'm using it different . I don't put filter in route


At : /var/www/htdocs/appstarter/app/Filters

//i have my classes

├── MyFilter.php
├── MyFilter10.php
├── MyFilter2.php
├── MyFilter3.php
├── MyFilter4.php
├── MyFilter5.php
├── MyFilter6.php
├── MyFilter7.php
├── MyFilter8.php
└── MyFilter9.php


eg
Code:
<?php namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;


class MyFilter implements FilterInterface
{
        public function before(RequestInterface $request, $arguments = null)
        {
            session_start();
   
           $logic=isset($_SESSION['role']) ;
           if($logic==false)
           {
            return redirect('spam');
   
           }
   
 
then in app/Config/Filters.php


Code:
<?php namespace Config;

use CodeIgniter\Config\BaseConfig;

class Filters extends BaseConfig
{
    // Makes reading things below nicer,
    // and simpler to change out script that's used.
    public $aliases = [
        'csrf'     => \CodeIgniter\Filters\CSRF::class,
        'toolbar'  => \CodeIgniter\Filters\DebugToolbar::class,
        'honeypot' => \CodeIgniter\Filters\Honeypot::class,
        'myfilter'=> \App\Filters\MyFilter::class,
        'myfilter2'=> \App\Filters\MyFilter2::class,
        
        
        
    ];

    // Always applied before every request
    public $globals = [
        'before' => [
            //'honeypot'
            // 'csrf',
        ],
        'after'  => [
            'toolbar',
            //'honeypot'
        ],
    ];

    // Works on all of a particular HTTP method
    // (GET, POST, etc) as BEFORE filters only
    //     like: 'post' => ['CSRF', 'throttle'],
    public $methods = [];

    // List filter aliases and any before/after uri patterns
    // that they should run on, like:
    //    'isLoggedIn' => ['before' => ['account/*', 'profiles/*']],
    public $filters = [
    
    
    'myfilter' => ['before' => ['newblog']],
    'myfilter9' => ['before' => ['admin']],
//etc
    
    
    ];
}
But in documentation https://codeigniter.com/userguide4/incom...ng-filters is write as my code..
Reply
#4

Looks like some inverted logic in the filter (?):

Code:
if (isset($_SESSION['user_id']))

should perhaps be:

Code:
if (! isset($_SESSION['user_id']))
Reply
#5

No but work if i write :

!session()->get('user_id')  instead !isset($_SESSION['user_id'])

Why ?
Reply
#6

It looks like you also need to get a handle to $_SESSION in the way you have things set up.

To get $_SESSION working, insert this:  $this->session = \Config\Services:: session();

So your filter will look like:


Code:
public function before(RequestInterface $request, $params = null)
{
   $this->session = \Config\Services::session();

   if (! isset($_SESSION['user_id']))
   ...
Reply




Theme © iAndrew 2016 - Forum software by © MyBB