0

各会社の各ブランチには、独自のダッシュボードがあります。ユーザーがブランチのダッシュボードにアクセスします (ただし、/dashboard/<company>/<branch>/loginログインしていない場合はリダイレクトされます)。

これは、次のような非常に多くのハンドラーがあることを意味します<company>/<branch>

_auth_routes = [
    RedirectRoute('/dashboard/<company>/<branch>/signup', SignupHandler, name="user-signup", strict_slash=True),
    RedirectRoute('/dashboard/<company>/<branch>/<type:v|p>/<user_id:\d+>-<signup_token:.+>',
                  handler=VerificationHandler, name='verification', strict_slash=True),
    RedirectRoute('/dashboard/<company>/<branch>/password', SetPasswordHandler),
    RedirectRoute('/dashboard/<company>/<branch>/login', LoginHandler, name='login'),
    RedirectRoute('/dashboard/<company>/<branch>/logout', LogoutHandler, name='logout'),
    RedirectRoute('/dashboard/<company>/<branch>/forgot', ForgotPasswordHandler, name='forgot'),
    RedirectRoute('/dashboard/<company>/<branch>/authenticated', AuthenticatedHandler, name='authenticated')
]

次に、各ハンドラには get(company, branch, ..) と post(company, branch, ..) が必要です

また、ほとんどのメソッドは、次のデコレータで装飾する必要があります。

def user_and_company_and_branch_required(handler):
    def check_company(self, company, branch, *args, **kwargs):
        auth = self.auth
        if not auth.get_user_by_session():
            self.redirect(self.uri_for('login', company=company,
                                               branch=branch), abort=True)
        elif company != self.user_info['company_name']:
            self.redirect(self.uri_for('login', company=company,
                                        branch=branch), abort=True)
        elif branch != self.user_info['branch_name']:
            self.redirect(self.uri_for('login', company=company,
                                        branch=branch), abort=True)
        else:
            return handler(self, company, *args, **kwargs)

    return check_company

最後に、self.uri_for を使用するたびに、会社と支店を追加する必要があります。

会社と支店を抽象化して、どこにでも入力する必要がないようにしたいと考えています。

2番目のベースハンドラーを作成することを検討しています:

class BaseHandler2(BaseHandler):
    def get(self,company, branch):
        #sget meaning secure_get
        sget = user_and_company_and_branch_required(self.sget)
        sget(self)
    def post(self,company, branch):
        spost = user_and_company_and_branch_required(self.spost)
        spost(self)

利用方法:

class LoginHandler(BaseHandler2):
     def get():
         self.render_template("login_form.html")

class SecureDashboardHanlder(BaseHandler2):
     def sget():
         self.render_template("this is the secure page
                               for your company & username &branch")

これは、このような問題に対して推奨されるアーキテクチャでしょうか?

他のオプションは、何らかの方法で app.yaml 正規表現を使用するか、カスタム ルーター クラスを使用することでしょうか?

ユーザーの user_attributes の下に company_name と branch_name があることに注意してください。

config = {
    'webapp2_extras.auth': {
        'user_model': 'dashboard_auth_models.User',
        'user_attributes': ['name', 'company_name']
    },
    'webapp2_extras.sessions': {
        'secret_key': 'f02fajgt9a309ga30gfbnxz252mn3b459082'
    }
}

または、どこでもデコレータを使用する方がよいでしょうか? すべてのハンドラーの get および post メソッドへの引数に会社、分岐を含めます。

4

0 に答える 0