2017-05-23 7 views
2

ダッシュボードをレンダリングするURLの定義済みセットを持つdjango-dashingというdjangoライブラリを使用しています。私は、ルータが唯一の私がdjango-dashing内のいくつかのコンフィグ設定で行うことができ、管理者によってアクセスできるようにしたい、このブラックボックス化されたルートURLのDjangoライト認証リダイレクト

urlpatterns = [ 
    ... 
    url(r'^dashboard/', include(dashing_router.urls)), 
    ... 
] 

のようにそれらをインポートします。しかし、管理者以外のユーザーが/dashboard/にアクセスしようとすると、がある403を投げるのではなく、djangoの/admin/パネルにそれらをリダイレクトしてログインさせたいと考えています。

ビューが効果的にブラックボックス化されているので、私は、/dashboard/へのリクエストをインターセプトする「プレビュー」を書く方法があるかどうか、具体的には適切なリダイレクトを行い、実際のダッシュボードに

私はこれが/dashboard-auth/よう/dashboard/にリダイレクトされ、2つのURLを書き込むことによって行うのに十分簡単だろうけど、私は、ユーザーが別の

に任意の提案を取得するために、1つのURLにアクセスしてくださいする必要がありますする必要はありません?

答えて

0

look insideダッシュングURLの「ブラックボックス」にお寄せいただければ、/dashboard/Dashboardビューで処理されていることがわかります。このビューをサブクラス化して、PermissionDeniedエラーをキャッチすることができます。

from django.core.exceptions import PermissionDenied 

from dashing.views import Dashboard 

class MyDashboard(Dashboard): 
    def get(self, request, *args, **kwargs): 
     try: 
      return super(MyDashboard, self).get(request, *args, **kwargs) 
     except PermissionDenied: 
      return redirect('/admin/') 

その後上記の威勢のURLビューを追加します。私はそれを行うだろう

urlpatterns = [ 
    ... 
    url(r'^dashboard/$', MyDashboard.as_view()) 
    url(r'^dashboard/', include(dashing_router.urls)), 
    ... 
] 
+2

他のダッシュボードのURLはどうですか?彼らは誰にも開放されるだろう – Brobin

+0

@Brobinなぜ彼らは誰にも開放されていると思いますか?私は他のURLから許可チェックを削除していないので、前と同じアクセス許可チェックがあります。 – Alasdair

+1

彼らは誰にも公開されませんでした。あなたが 'django-dashing'の設定のアクセス権で設定した人には誰でも公開できます。 – mjkaufer

1

方法は、威勢のデフォルトルータをオーバーライドすることです。すべてのURLはRouterクラスによって動的に生成されるため、get_urlsメソッドをオーバーライドすると、staff_member_requiredデコレータの各関数をラップすることができます。その後

from django.contrib.admin.views.decorators import staff_member_required 
from django.conf.urls import url 

from dashing.utils import Router 
from dashing.views import Dashboard 


class AdminRequiredRouter(Router): 

    def get_urls(self): 
     urlpatterns = [ 
      url(r'^$', staff_member_required(Dashboard.as_view()), name='dashboard'), 
     ] 
     for widget, basename, parameters in self.registry: 
      urlpatterns += [ 
       url(r'/'.join((
        r'^widgets/{}'.format(basename), 
        r'/'.join((r'(?P<{}>{})'.format(parameter, regex) 
           for parameter, regex in parameters.items())), 
       )), 
        staff_member_required(widget.as_view()), 
        name='widget_{}'.format(basename)), 
      ] 
     return urlpatterns 

router = AdminRequiredRouter() 

ルーターを含める代わりに、威勢の

from .router import router 

urlpatterns = [ 
    ... 
    url(r'^dashboard/', include(router.urls)), 
    ... 
] 
3

A Djangoの単純なカスタムミドルウェアは別のオプションです...

from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 

class DashingRedirectMiddleware(object): 

    def process_request(self, request): 
     if request.path.startswith('/dashing/') and not request.user.is_staff: 
      return HttpResponseRedirect(reverse('admin:login')) 
     return 

は、あなたのジャンゴに、このミドルウェアを追加することを忘れないでください。設定...

MIDDLEWARE_CLASSES = [ 
    ... 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'yourapp.middleware.DashingRedirectMiddleware', 
    ... 
] 

そういうものか。

+0

ありがとう、きれいに/最も単純な答え – mjkaufer

+1

あなたは 'next {{{}} {next} {1} 'を設定することもできます。 ( 'admin:login')、request.path) 'ログインすると、ユーザーがアクセスしようとしていたページに移動します。 – Brobin

+0

この回答の唯一の欠点は、ミドルウェアが、サイト、これは過労のようです – mjkaufer

関連する問題