Yii:会员区域的共享密码

时间:2012-07-11 15:32:30

标签: authentication yii

在Yii中设置共享密码保护区域的最佳方法是什么?

我希望看到一个Group模型,可以通过该组所有者创建的共享密码访问 - 组成员不必登录,只需输入此密码即可。

Yii内置的auth工具是否仍然可以完成这项工作? - 或者是否有更简单的解决方案,请记住有人可能想要访问多个组。

2 个答案:

答案 0 :(得分:0)

您可以使用PHP内置的标准会话机制来完成此操作。当有人试图查看受密码保护的区域时,检查会话变量,如果用户尚未输入密码,则将其重定向到某个带密码表单的页面(例如,您可以使用控制器过滤器进行检查)。

提交表单后,检查密码的正确性,如果一切正常,请将其写入会话。您可以按组ID区分会话密钥。

答案 1 :(得分:0)

您可以使用Yii filter功能在执行控制器操作之前触发代码,并阻止您不希望允许的操作。

我会为你的所有组页面创建一个通用控制器,并在需要时从这个继承其他控制器。

在过滤器中,我会设置代码来检查/提示输入密码,并将其保存在会话中。

例如,我们有一个过滤器设置来检测用户是否已接受我们修订的条款和条件。过滤器将检测并阻止访问控制器,直到用户不确认为止。

class TocConfirmFilter extends CFilter {

    /**
     * Initializes the filter.
     * This method is invoked after the filter properties are initialized
     * and before {@link preFilter} is called.
     * You may override this method to include some initialization logic.
     */
    public function init() {

    }

    /**
     * Performs the pre-action filtering.
     * @param CFilterChain the filter chain that the filter is on.
     * @return boolean whether the filtering process should continue and the action
     * should be executed.
     */
    protected function preFilter($filterChain) {

        // do not perform this filter on this action
        if ($filterChain->action->controller->id . '/' . $filterChain->action->id == 'public/onePublicPage') {
            return true;
        }


        if (isset(Yii::app()->user->id)) {
            $user = user::model()->findbyPk(Yii::app()->user->id);
            if ($user === null)
                throw new CHttpException(404, 'The requested user does not exist.');
            if ($user->tocconfirmed == 0) {
                Yii::app()->getRequest()->redirect(Yii::app()->createAbsoluteUrl('authorize/confirm'));
                return false;
            }
        }
        return true;
    }

    /**
     * Performs the post-action filtering.
     * @param CFilterChain the filter chain that the filter is on.
     */
    protected function postFilter($filterChain) {

    }

}