yii2单点接入ucenter(原创)

Posted 山上小和尚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii2单点接入ucenter(原创)相关的知识,希望对你有一定的参考价值。

1.第一步

在中心端添加应用,此处略去,根据官方文档即可实现.

第二步.

用户表如下,基本用原生的用户表即可,取决于你的ucenter主机服务端传送什么用户信息:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT \'用户名\',
`password_hash` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT \'密码\',
`password_reset_token` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'密码token\',
`email` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'邮箱\',
`auth_key` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`status` tinyint(5) NULL DEFAULT 1 COMMENT \'0禁用 1启用\',
`created_at` int(18) NULL DEFAULT NULL COMMENT \'创建时间\',
`updated_at` int(18) NULL DEFAULT NULL COMMENT \'更新时间\',
`realname` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'真实名称\',
`user_id` int(11) NULL DEFAULT NULL COMMENT \'统一登录用户id\',
`dep_id` int(11) NULL DEFAULT NULL COMMENT \'部门id\',
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`nickname` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'昵称\',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 72 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = \'后台用户表\' ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

 

第三步:

yii2在配置文件加入:

    \'components\' => [
      ...
        \'ucenter\' => [
            \'class\' => \'yii\\lyuser\\Client\',
            \'baseUrl\' => \'http://www-test.lanyife.com.cn/passport\',
            \'appKey\' => \'medusa\',
            \'appSecret\' => \'1f13f6b2508b03b25dc1088588bef3eb\',
            \'jumpUrl\' => "http://{$_SERVER[\'HTTP_HOST\']}/site/login",
            \'url\' => "http://{$_SERVER[\'HTTP_HOST\']}",
        ],
     ...
    ],

 

第四步:

在默认控制器里这么改造

<?php
namespace backend\\controllers;

use Yii;
use yii\\helpers\\Url;
use yii\\web\\Controller;
use yii\\filters\\VerbFilter;
use yii\\filters\\AccessControl;
use common\\models\\LoginForm;
use common\\models\\User;
use yii\\web\\Response;

/**
 * Site controller
 */
class SiteController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            \'verbs\' => [
                \'class\' => VerbFilter::className(),
                \'actions\' => [
                    \'delete\' => [\'POST\'],
                ],
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function actions()
    {
        return [
            \'error\' => [
                \'class\' => \'yii\\web\\ErrorAction\',
            ],
        ];
    }

    /**
     * Displays homepage.
     *
     * @return string
     */
    public function actionIndex()
    {
        if(yii::$app->user->isGuest){
            return $this->redirect(Url::toRoute(\'site/login\'));
        }
        return $this->render(\'index\');
    }

    /**
     * Login action.
     *
     * @return string
     */
    public function actionLogin()
    {
        if( \\Yii::$app->user->isGuest ){
            return \\Yii::$app->ucenter->goLogin();
        }
        $this->redirect(\'/\');

    }



    /**
     * 同步登录
     * @return string
     */
    public function actionSyncLogin()
    {
        $r = \\Yii::$app->ucenter->synLogin();

//        \\Yii::$app->response->format = Response::FORMAT_JSONP;
        if ($r) {
            if (\\Yii::$app->request->get(\'action\') == \'login\') {
                //获取登录用户信息
                $userInfo = \\Yii::$app->ucenter->getUserInfo();
                file_put_contents(\'/tmp/77.log\',json_encode($userInfo).date(\'y-m-d H:i:s\')  );
                if (empty($userInfo)) {
                    return false;
                }
                $res =  $this->_loginOrRegister($userInfo);

                if($res){
                    $user = User::findOne([\'username\'=>$userInfo[\'username\'] ]);
                    \\Yii::$app->getUser()->login($user, 86400);
                }

            }

            \\Yii::$app->response->content = \'login(1)\';
        } else {
            \\Yii::$app->response->content = \'login(0)\';
        }
        \\Yii::$app->response->send();
        \\Yii::$app->end();
    }



    //注销
    public function actionLogout()
    {
        //本地 注销
        Yii::$app->user->logout();
        // Yii::$app->getUser()->logout();
        //跳转UCenter注销页面 $callback 注销返回的url

        \\Yii::$app->ucenter->goLogout(\\Yii::$app->ucenter->jumpUrl);
    }


    /**
     * 第一次登录或者多次登录,实现信息同步并注册
     * @param array $userInfo
     * @return bool
     */
    private function _loginOrRegister($userInfo)
    {


        if (empty($userInfo)||!isset($userInfo[\'username\'])) {
            return false;
        }

        $user = User::findOne([\'username\'=>$userInfo[\'username\']]);
        if (empty($user)) {
            //保存创建本地新用户
             $res =  yii::$app->db->createCommand()->insert(\'user\',[
                \'username\' => $userInfo[\'username\'],
                \'auth_key\'=> $userInfo[\'auth_key\'],
                \'realname\' =>$userInfo[\'realname\'],
                \'user_id\' => $userInfo[\'id\'],
                \'dep_id\' => $userInfo[\'dep_id\'],
                \'status\' => $userInfo[\'status\'],
                \'created_at\' =>$userInfo[\'created_at\'],
                \'updated_at\'=> $userInfo[\'updated_at\'],
                \'email\' =>$userInfo[\'email\'],
                \'title\' =>$userInfo[\'title\'],
                \'nickname\' => $userInfo[\'nickname\'],
          //模型User的激活状态要定义,比如我
          //见下图
                \'status\' => User::STATUS_ACTIVE,
                 \'password_hash\'=>Yii::$app->security->generatePasswordHash(\'123456\')
            ])->execute();
        } else {
            yii::$app->db->createCommand()->update(\'user\',[\'user_id\'=>$userInfo[\'id\']] ,[
                \'dep_id\' => $userInfo[\'dep_id\'],
                \'realname\' => $userInfo[\'realname\'],
                \'updated_at\' => $userInfo[\'updated_at\'],
                \'title\' => $userInfo[\'title\'],
            ])->execute();
        }

        return true;
    }



}

 

 

以上是关于yii2单点接入ucenter(原创)的主要内容,如果未能解决你的问题,请参考以下文章

phpcms 用户修改头像

discuz x2怎么实现cas单点登录?

Yii2片段缓存详解

通过伪代码结合理论模拟pc端接入单点登录(Oauth2浙里办)

通过伪代码结合理论模拟pc端接入单点登录(Oauth2浙里办)

单点接入方案总结