2015-06-27 13 views
15

मैं वेब एपीआई सुरक्षित करने के लिए देख रहा हूँ बोतल का उपयोग किया और एक व्यवस्थापक इंटरफेस प्रदान करने flask-admin के साथ एकीकृत। मैंने खोज की और पाया कि फ्लास्क-एडमिन में /admin पर एक व्यवस्थापक पैनल है और डिफ़ॉल्ट रूप से किसी के पास इसका उपयोग हो सकता है। यह कोई प्रमाणीकरण प्रणाली प्रदान नहीं करता है और पूरी तरह से खुला रहता है (बिना किसी सुरक्षा के) क्योंकि उन्होंने यह नहीं माना कि सुरक्षा प्रदान करने के लिए क्या उपयोग किया जाएगा। इस एपीआई को उत्पादन में इस्तेमाल किया जाना चाहिए, इसलिए हमारे पास यूआरएल मारने वाले हर किसी के लिए /admin रूट नहीं हो सकता है। उचित प्रमाणीकरण की आवश्यकता है।कुप्पी के सुरक्षा के साथ कुप्पी के व्यवस्थापक पैनल सुरक्षित रखने के तरीके

views.py में मैं बस /admin मार्ग रख सकते हैं नहीं और प्रमाणीकरण प्रदान डेकोरेटर के माध्यम से के रूप में उस पर लेखन पहले से ही flask-admin द्वारा बनाई मौजूदा मार्ग ताकि एक त्रुटि का कारण होता होगा।

आगे के शोध से पता चलता है कि दो मॉड्यूल flask-admin और flask-security हैं। मैं जानता हूँ कि flask-admin यह सुरक्षित करने के लिए is_accessible विधि है, लेकिन यह जो flask-security द्वारा प्रदान की गई बहुत कार्यक्षमता प्रदान नहीं करता है।

मुझे /admin और जैसे /admin से शुरू होने वाले अन्य सभी एंड-पॉइंट्स को सुरक्षित करने के लिए कोई विधि नहीं मिली है।

मैं विशेष रूप से देख रहा हूँ कुप्पी के सुरक्षा के साथ इस कार्य को करने के लिए। यदि यह संभव नहीं है, तो कृपया विकल्पों का सुझाव दें।

पुनश्च: मुझे लगता है मैं ngnix ही लॉक कर सकते हैं पता है, लेकिन है कि पिछले विकल्प होगा। अगर मेरे पास flask-security के माध्यम से प्रमाणीकरण प्रणाली हो सकती है जो अच्छा होगा।

+1

फ्लास्क-सुरक्षा की प्रमाणीकरण तंत्र (फ्लास्क-लॉगिन के माध्यम से) 'current_user.is_authenticated()' के वापसी मान को नियंत्रित करता है। आपके 'is_accessible' कार्यान्वयन में यह संभवतः (किसी प्रकार की भूमिका/अनुमति जांच के साथ संयुक्त) को लौटने से आपको फ्लास्क-एडमिनिस्ट्रेशन के भीतर फ्लास्क-सुरक्षा की सुरक्षा का उपयोग करने की क्षमता मिलनी चाहिए। – jonafato

उत्तर

4

आप Flask-Security-Admin परियोजना की जांच करनी चाहिए, मुझे लगता है कि यह बहुत स्पष्ट रूप से आप के लिए क्या देख रहे शामिल किया गया।

ऊपर के लिंक से सीधे लिया गया:

  • जब आप पहली बार एप्लिकेशन के होम पेज पर, आप कुप्पी के सुरक्षा के लिए धन्यवाद में लॉग इन करने का संकेत दिया जाएगा।
  • यदि आप [email protected] और पासवर्ड = पासवर्ड के साथ प्रवेश, आप "अंतिम-उपयोगकर्ता" भूमिका होगा।
  • यदि आप [email protected] और पासवर्ड = पासवर्ड के साथ प्रवेश, आप "व्यवस्थापक" भूमिका होगा।
  • किसी भी भूमिका को होम पेज तक पहुंचने की अनुमति है।
  • या तो व्यवस्थापक पृष्ठ तक पहुंचने के लिए किसी भी भूमिका की अनुमति है। हालांकि, जब तक आपके पास "व्यवस्थापक" भूमिका न हो, तब तक आपको इस पृष्ठ पर उपयोगकर्ताओं और भूमिकाओं के प्रशासन के लिए टैब नहीं दिखाई देंगे।
  • केवल व्यवस्थापक भूमिका को/व्यवस्थापक पृष्ठ जैसे/व्यवस्थापक/userview के उप-पृष्ठों तक पहुंचने की अनुमति है। अन्यथा, आपको एक "वर्जित" प्रतिक्रिया मिलेगी।
  • ध्यान दें कि, उपयोगकर्ता को संपादित करते समय, भूमिकाओं के नाम स्वचालित रूप से आते हैं Flask-Admin के लिए धन्यवाद।
  • आप उपयोगकर्ता और भूमिकाओं को जोड़ और संपादित कर सकते हैं। परिणामी उपयोगकर्ता लॉग इन करने में सक्षम होंगे (जब तक कि आप सक्रिय = झूठी सेट न करें) और, यदि उनके पास "व्यवस्थापक" भूमिका है, तो वे प्रशासन करने में सक्षम होंगे।

प्रासंगिक कोड main.py में स्थित है, और स्पष्ट रूप से कुप्पी के सुरक्षा का उपयोग कुप्पी के व्यवस्थापक पैनल हासिल करने की प्रक्रिया को दोहराने के लिए कैसे व्याख्या करने के लिए टिप्पणी की है।

# Prevent administration of Users unless the currently logged-in user has the "admin" role 
def is_accessible(self): 
    return current_user.has_role('admin') 

मुझे आशा है कि यह उपयोगी है:

सबसे बुनियादी है, तो आप के लिए प्रासंगिक टुकड़ा निम्नलिखित (लाइन 152-) है।

+1

धन्यवाद! कुछ और खुदाई और शोध के बाद मुझे यह काम करने के लिए मिला। –

+0

इसे प्रदान करने के लिए धन्यवाद। मैं एक घंटे के लिए जवाब खोज रहा हूं और आखिर में यह आपके साथ यहां पाया। – applecrusher

1

वहाँ कुप्पी के व्यवस्थापक दस्तावेज में सुरक्षा के बारे में खंड है: http://flask-admin.readthedocs.io/en/latest/introduction/#authorization-permissions

+0

मैंने यहां पोस्ट करने से पहले इसे पहले ही देखा है और इस खंड में उदाहरण 'फ्लास्क-एडमिन' का उपयोग करने और 'फ्लास्क-सुरक्षा' नहीं करने के बारे में दिखाते हैं। मैं विशेष रूप से इसे 'फ्लास्क-सुरक्षा' के माध्यम से करने के लिए देख रहा हूं क्योंकि यह 'फ्लास्क-लॉगिन' की अधिक कार्यक्षमता प्रदान करता है। किसी भी सहायता की सराहना की जाएगी। –

+0

@ जोस https://stackoverflow.com/questions/46914054/access-control-for-flask-admin – Sparrowcide

6

चूंकि यह "फ्लास्क-सुरक्षा सुरक्षित व्यवस्थापक" Google खोज के लिए पहला परिणाम है, और अभी तक कोई आउट ऑफ़ द बॉक्स समाधान नहीं है, मुझे लगता है कि मैं योगदान कर सकता हूं।

फ्लास्क-एडमिन प्रोजेक्ट Issue List पर एक समान प्रश्न पूछा गया था और फ्लास्क-लॉगिन और मोगोडब का उपयोग करके एक साधारण उदाहरण here प्रदान किया गया है।

मैंने एसक्लाइट डेटाबेस और फ्लास्क-सुरक्षा के लिए एसक्यूएलकेमी का उपयोग करके एक उदाहरण बनाया। देखें नीचे दिए गए नमूना कुप्पी एप्लिकेशन:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os 
import os.path as op 
from flask import Flask, render_template, url_for, request 
from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy.event import listens_for 
from flask.ext.security import current_user, login_required, RoleMixin, Security, SQLAlchemyUserDatastore, UserMixin 
from flask_admin import Admin, AdminIndexView 
from flask_admin.contrib import sqla 

# Create application 
app = Flask(__name__) 

# Create dummy secrety key so we can use sessions 
app.config['SECRET_KEY'] = '123456790' 

# Create in-memory database 
app.config['DATABASE_FILE'] = 'sample_db.sqlite' 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE'] 
app.config['SQLALCHEMY_ECHO'] = True 
db = SQLAlchemy(app) 

# Create directory for file fields to use 
file_path = op.join(op.dirname(__file__), 'static/files') 

# flask-security models 

roles_users = db.Table('roles_users', 
     db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), 
     db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))) 

class Role(db.Model, RoleMixin): 
    id = db.Column(db.Integer(), primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    description = db.Column(db.String(255)) 

class User(db.Model, UserMixin): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(255), unique=True) 
    password = db.Column(db.String(255)) 
    active = db.Column(db.Boolean()) 
    confirmed_at = db.Column(db.DateTime()) 
    roles = db.relationship('Role', secondary=roles_users, 
          backref=db.backref('users', lazy='dynamic')) 

# Create Security 
user_datastore = SQLAlchemyUserDatastore(db, User, Role) 
security = Security(app, user_datastore) 

# Only needed on first execution to create first user 
#@app.before_first_request 
#def create_user(): 
# db.create_all() 
# user_datastore.create_user(email='[email protected]', password='pass') 
# db.session.commit() 

class AnyModel(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 

    def __unicode__(self): 
     return self.name 

class MyAdminIndexView(AdminIndexView): 
    def is_accessible(self): 
     return current_user.is_authenticated() # This does the trick rendering the view only if the user is authenticated 

# Create admin. In this block you pass your custom admin index view to your admin area 
admin = Admin(app, 'Admin Area', template_mode='bootstrap3', index_view=MyAdminIndexView()) 


# Add views 
admin.add_view(sqla.ModelView(AnyModel, db.session)) 

# To acess the logout just type the route /logout on browser. That redirects you to the index 
@login_required 
@app.route('/login') 
def login(): 
    return redirect('/admin') 

@app.route('/') 
def index(): 
    return render_template('index.html') 


if __name__ == '__main__': 

    # Build sample db on the fly, if one does not exist yet. 
    db.create_all() 
    app.run(debug=True) 

कृपया how to customize the login page जानने के लिए कुप्पी के सुरक्षा दस्तावेज़ देखें।

उम्मीद है कि इससे मदद मिलती है।

0

मैं सभी उप-विचारों के लिए @ रामीमैक के उत्तर का उपयोग करता हूं, लेकिन सूचकांक के लिए (डिफ़ॉल्ट रूप से /admin), मैं इस विधि का उपयोग करता हूं, विधि को admin भूमिका के साथ पुन: लपेटता हूं।

@app.before_first_request 
def restrict_admin_url(): 
    endpoint = 'admin.index' 
    url = url_for(endpoint) 
    admin_index = app.view_functions.pop(endpoint) 

    @app.route(url, endpoint=endpoint) 
    @roles_required('admin') 
    def secure_admin_index(): 
     return admin_index() 

अपने प्रोजेक्ट में, यह सब मेरी Flask-Admin कोड है, जो खुद अपनी ही स्टार्टअप स्क्रिप्ट, custom_flaskadmin.py में है के बाद सीधे चला जाता है।

संबंधित मुद्दे