Add last-login-ip capture capability (#184)

This commit is contained in:
Kartik Visweswaran
2018-05-16 18:59:08 +05:30
committed by Lorenzo Milesi
parent 01d9052416
commit 71f9587374
8 changed files with 64 additions and 9 deletions

View File

@ -1,6 +1,7 @@
# CHANGELOG # CHANGELOG
## 1.1.5 - Work in progress ## 1.1.5 - Work in progress
- Enh #184: Add `last-login-ip` capture capability (kartik-v)
- Enh: Changed `View::render()` calls in views to use absolute paths (ajmedway) - Enh: Changed `View::render()` calls in views to use absolute paths (ajmedway)
- Fix #169: Fix bug in ReCaptchaComponent (BuTaMuH) - Fix #169: Fix bug in ReCaptchaComponent (BuTaMuH)
- Fix #168: Fix spelling in russian language (EvgenyOrekhov) - Fix #168: Fix spelling in russian language (EvgenyOrekhov)

View File

@ -137,7 +137,10 @@ class SecurityController extends Controller
$this->trigger(FormEvent::EVENT_BEFORE_LOGIN, $event); $this->trigger(FormEvent::EVENT_BEFORE_LOGIN, $event);
if ($form->login()) { if ($form->login()) {
$form->getUser()->updateAttributes(['last_login_at' => time()]); $form->getUser()->updateAttributes([
'last_login_at' => time(),
'last_login_ip' => Yii::$app->request->getUserIP(),
]);
$this->trigger(FormEvent::EVENT_AFTER_LOGIN, $event); $this->trigger(FormEvent::EVENT_AFTER_LOGIN, $event);

View File

@ -0,0 +1,29 @@
<?php
namespace Da\User\Migration;
use yii\db\Migration;
use yii\db\Schema;
/**
* Class m000000_000008_add_last_login_ip
* @author: Kartik Visweswaran
*/
class m000000_000008_add_last_login_ip extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('{{%user}}', 'last_login_ip', Schema::TYPE_STRING . '(45) DEFAULT NULL AFTER last_login_at');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('{{%user}}', 'last_login_ip');
}
}

View File

@ -43,13 +43,14 @@ use yii\web\IdentityInterface;
* @property string $auth_key * @property string $auth_key
* @property string $auth_tf_key * @property string $auth_tf_key
* @property int $auth_tf_enabled * @property int $auth_tf_enabled
* @property int $registration_ip * @property string $registration_ip
* @property int $confirmed_at * @property int $confirmed_at
* @property int $blocked_at * @property int $blocked_at
* @property int $flags * @property int $flags
* @property int $created_at * @property int $created_at
* @property int $updated_at * @property int $updated_at
* @property int $last_login_at * @property int $last_login_at
* @property string $last_login_ip
* @property int $password_changed_at * @property int $password_changed_at
* @property int $password_age * @property int $password_age
* *
@ -150,7 +151,8 @@ class User extends ActiveRecord implements IdentityInterface
'password' => Yii::t('usuario', 'Password'), 'password' => Yii::t('usuario', 'Password'),
'created_at' => Yii::t('usuario', 'Registration time'), 'created_at' => Yii::t('usuario', 'Registration time'),
'confirmed_at' => Yii::t('usuario', 'Confirmation time'), 'confirmed_at' => Yii::t('usuario', 'Confirmation time'),
'last_login_at' => Yii::t('usuario', 'Last login'), 'last_login_at' => Yii::t('usuario', 'Last login time'),
'last_login_ip' => Yii::t('usuario', 'Last login IP'),
'password_changed_at' => Yii::t('usuario', 'Last password change'), 'password_changed_at' => Yii::t('usuario', 'Last password change'),
'password_age' => Yii::t('usuario', 'Password age'), 'password_age' => Yii::t('usuario', 'Password age'),
]; ];

View File

@ -39,6 +39,10 @@ class UserSearch extends Model
* @var string * @var string
*/ */
public $registration_ip; public $registration_ip;
/**
* @var string
*/
public $last_login_ip;
/** /**
* @var UserQuery * @var UserQuery
*/ */
@ -62,7 +66,7 @@ class UserSearch extends Model
public function rules() public function rules()
{ {
return [ return [
'safeFields' => [['username', 'email', 'registration_ip', 'created_at', 'last_login_at'], 'safe'], 'safeFields' => [['username', 'email', 'registration_ip', 'created_at', 'last_login_at, last_login_ip'], 'safe'],
'createdDefault' => [['created_at', 'last_login_at'], 'default', 'value' => null], 'createdDefault' => [['created_at', 'last_login_at'], 'default', 'value' => null],
]; ];
} }
@ -77,7 +81,8 @@ class UserSearch extends Model
'email' => Yii::t('usuario', 'Email'), 'email' => Yii::t('usuario', 'Email'),
'created_at' => Yii::t('usuario', 'Registration time'), 'created_at' => Yii::t('usuario', 'Registration time'),
'registration_ip' => Yii::t('usuario', 'Registration IP'), 'registration_ip' => Yii::t('usuario', 'Registration IP'),
'last_login_at' => Yii::t('usuario', 'Last login'), 'last_login_at' => Yii::t('usuario', 'Last login time'),
'last_login_ip' => Yii::t('usuario', 'Last login IP'),
]; ];
} }
@ -114,7 +119,8 @@ class UserSearch extends Model
$query $query
->andFilterWhere(['like', 'username', $this->username]) ->andFilterWhere(['like', 'username', $this->username])
->andFilterWhere(['like', 'email', $this->email]) ->andFilterWhere(['like', 'email', $this->email])
->andFilterWhere(['registration_ip' => $this->registration_ip]); ->andFilterWhere(['registration_ip' => $this->registration_ip])
->andFilterWhere(['last_login_ip' => $this->last_login_ip]);
return $dataProvider; return $dataProvider;
} }

View File

@ -11,6 +11,7 @@
namespace Da\User\Service; namespace Da\User\Service;
use Yii;
use Da\User\Contracts\ServiceInterface; use Da\User\Contracts\ServiceInterface;
use Da\User\Model\User; use Da\User\Model\User;
@ -25,6 +26,9 @@ class PasswordExpireService implements ServiceInterface
public function run() public function run()
{ {
return $this->model->updateAttributes(['last_login_at' => time()]); return $this->model->updateAttributes([
'last_login_at' => time(),
'last_login_ip' => Yii::$app->request->getUserIP(),
]);
} }
} }

View File

@ -52,7 +52,7 @@ $module = Yii::$app->getModule('user');
'attribute' => 'created_at', 'attribute' => 'created_at',
'value' => function ($model) { 'value' => function ($model) {
if (extension_loaded('intl')) { if (extension_loaded('intl')) {
return Yii::t('usuario', '{0, date, MMMM dd, YYYY HH:mm}', [$model->created_at]); return Yii::t('usuario', '{0, date, MMM dd, YYYY HH:mm}', [$model->created_at]);
} }
return date('Y-m-d G:i:s', $model->created_at); return date('Y-m-d G:i:s', $model->created_at);
@ -64,12 +64,21 @@ $module = Yii::$app->getModule('user');
if (!$model->last_login_at || $model->last_login_at == 0) { if (!$model->last_login_at || $model->last_login_at == 0) {
return Yii::t('usuario', 'Never'); return Yii::t('usuario', 'Never');
} elseif (extension_loaded('intl')) { } elseif (extension_loaded('intl')) {
return Yii::t('usuario', '{0, date, MMMM dd, YYYY HH:mm}', [$model->last_login_at]); return Yii::t('usuario', '{0, date, MMM dd, YYYY HH:mm}', [$model->last_login_at]);
} else { } else {
return date('Y-m-d G:i:s', $model->last_login_at); return date('Y-m-d G:i:s', $model->last_login_at);
} }
}, },
], ],
[
'attribute' => 'last_login_ip',
'value' => function ($model) {
return $model->last_login_ip == null
? '<span class="not-set">' . Yii::t('usuario', '(not set)') . '</span>'
: $model->last_login_ip;
},
'format' => 'html',
],
[ [
'header' => Yii::t('usuario', 'Confirmation'), 'header' => Yii::t('usuario', 'Confirmation'),
'value' => function ($model) { 'value' => function ($model) {

View File

@ -73,6 +73,7 @@ CREATE TABLE `user` (
`auth_tf_enabled` tinyint(1) DEFAULT '0', `auth_tf_enabled` tinyint(1) DEFAULT '0',
`flags` int(11) NOT NULL DEFAULT '0', `flags` int(11) NOT NULL DEFAULT '0',
`last_login_at` int(11) DEFAULT NULL, `last_login_at` int(11) DEFAULT NULL,
`last_login_ip` varchar(45) DEFAULT NULL,
`password_changed_at` int(11) DEFAULT NULL, `password_changed_at` int(11) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),