Login.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace Widget;
  3. use Typecho\Cookie;
  4. use Typecho\Validate;
  5. use Widget\Base\Users;
  6. if (!defined('__TYPECHO_ROOT_DIR__')) {
  7. exit;
  8. }
  9. /**
  10. * 登录组件
  11. *
  12. * @category typecho
  13. * @package Widget
  14. * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
  15. * @license GNU General Public License 2.0
  16. */
  17. class Login extends Users implements ActionInterface
  18. {
  19. /**
  20. * 初始化函数
  21. *
  22. * @access public
  23. * @return void
  24. */
  25. public function action()
  26. {
  27. // protect
  28. $this->security->protect();
  29. /** 如果已经登录 */
  30. if ($this->user->hasLogin()) {
  31. /** 直接返回 */
  32. $this->response->redirect($this->options->index);
  33. }
  34. /** 初始化验证类 */
  35. $validator = new Validate();
  36. $validator->addRule('name', 'required', _t('请输入用户名'));
  37. $validator->addRule('password', 'required', _t('请输入密码'));
  38. $expire = 30 * 24 * 3600;
  39. /** 记住密码状态 */
  40. if ($this->request->remember) {
  41. Cookie::set('__typecho_remember_remember', 1, $expire);
  42. } elseif (Cookie::get('__typecho_remember_remember')) {
  43. Cookie::delete('__typecho_remember_remember');
  44. }
  45. /** 截获验证异常 */
  46. if ($error = $validator->run($this->request->from('name', 'password'))) {
  47. Cookie::set('__typecho_remember_name', $this->request->name);
  48. /** 设置提示信息 */
  49. Notice::alloc()->set($error);
  50. $this->response->goBack();
  51. }
  52. /** 开始验证用户 **/
  53. $valid = $this->user->login(
  54. $this->request->name,
  55. $this->request->password,
  56. false,
  57. 1 == $this->request->remember ? $expire : 0
  58. );
  59. /** 比对密码 */
  60. if (!$valid) {
  61. /** 防止穷举,休眠3秒 */
  62. sleep(3);
  63. self::pluginHandle()->loginFail(
  64. $this->user,
  65. $this->request->name,
  66. $this->request->password,
  67. 1 == $this->request->remember
  68. );
  69. Cookie::set('__typecho_remember_name', $this->request->name);
  70. Notice::alloc()->set(_t('用户名或密码无效'), 'error');
  71. $this->response->goBack('?referer=' . urlencode($this->request->referer));
  72. }
  73. self::pluginHandle()->loginSucceed(
  74. $this->user,
  75. $this->request->name,
  76. $this->request->password,
  77. 1 == $this->request->remember
  78. );
  79. /** 跳转验证后地址 */
  80. if (!empty($this->request->referer)) {
  81. /** fix #952 & validate redirect url */
  82. if (
  83. 0 === strpos($this->request->referer, $this->options->adminUrl)
  84. || 0 === strpos($this->request->referer, $this->options->siteUrl)
  85. ) {
  86. $this->response->redirect($this->request->referer);
  87. }
  88. } elseif (!$this->user->pass('contributor', true)) {
  89. /** 不允许普通用户直接跳转后台 */
  90. $this->response->redirect($this->options->profileUrl);
  91. }
  92. $this->response->redirect($this->options->adminUrl);
  93. }
  94. }