開干
繼承關(guān)系:
SupersetSecurityManager->SecurityManager->BaseSecurityManager->AbstractSecurityManager->BaseManager
其中除了第一個,其他的類已經(jīng)是在flask_appbuilder范疇强挫,可見是基于flask_appbuilder磅网。
__init__.py中
custom_sm = app.config.get('CUSTOM_SECURITY_MANAGER') or SupersetSecurityManager
if not issubclass(custom_sm, SupersetSecurityManager):
raise Exception(
"""Your CUSTOM_SECURITY_MANAGER must now extend SupersetSecurityManager,
not FAB's security manager.
See [4565] in UPDATING.md""")
appbuilder = AppBuilder(
app,
db.session,
base_template='superset/base.html',
indexview=MyIndexView,
security_manager_class=custom_sm,
update_perms=utils.get_update_perms_flag(),
)
如果沒有傳入security_manager_class參數(shù)拱层,appbuilder將會使用from flask_appbuilder.security.sqla.manager import SecurityManager(即SupersetSecurityManager的父類)作為security_manager纤子。
所有配置基本都在BaseSecurityManager類中园蝠,
...
def __init__(self, appbuilder):
super(BaseSecurityManager, self).__init__(appbuilder)
app = self.appbuilder.get_app
...
authdbview = AuthDBView
""" Override if you want your own Authentication DB view """
并且通過flask_appbuilder提供的方法獲取配置類型的方法
def auth_type(self):
return self.appbuilder.get_app.config['AUTH_TYPE']
找到superset項(xiàng)目的config.py文件中唆姐,
from flask_appbuilder.security.manager import AUTH_DB
...
AUTH_TYPE = AUTH_DB
因此狡门,默認(rèn)的鑒權(quán)方式是AUTH_DB瑟押,flask_appbuilder的base.py中appbuilder類下
...
@property
def get_url_for_login(self):
return url_for("%s.%s" % (self.sm.auth_view.endpoint, "login"))
@property
def get_url_for_logout(self):
return url_for("%s.%s" % (self.sm.auth_view.endpoint, "logout"))
...
可見使用AUTH_TYPE指定的鑒權(quán)方式對登入登出進(jìn)行校驗(yàn)搀捷。
BaseView類中
...
# If endpoint name is not provided, get it from the class name
self.endpoint = endpoint or self.__class__.__name__
...
鑒權(quán)
現(xiàn)在來看看appbuilder內(nèi)對登錄的鑒權(quán)邏輯,
class AuthDBView(AuthView):
login_template = 'appbuilder/general/security/login_db.html'
@expose('/login/', methods=['GET', 'POST'])
def login(self):
if g.user is not None and g.user.is_authenticated():
return redirect(self.appbuilder.get_url_for_index)
form = LoginForm_db()
if form.validate_on_submit():
# 調(diào)用 auth_user_db 驗(yàn)證多望,內(nèi)部調(diào)用 check_password_hash
# 比對表單中的password和數(shù)據(jù)庫的哈希值是否匹配
user = self.appbuilder.sm.auth_user_db(form.username.data, form.password.data)
if not user:
flash(as_unicode(self.invalid_login_message), 'warning')
return redirect(self.appbuilder.get_url_for_login)
# 驗(yàn)證通過調(diào)用login_user生成認(rèn)證信息
login_user(user, remember=False)
return redirect(self.appbuilder.get_url_for_index)
return self.render_template(self.login_template,
title=self.title,
form=form,
appbuilder=self.appbuilder)
iframe集成superset
- superset基本設(shè)置
D壑邸!先登錄后鑒權(quán)怀偷,登錄和鑒權(quán)是分離的<已帷!
將PUBLIC_ROLE_LIKE_GAMMA設(shè)置為True椎工,并給public角色增加can explore on Superset, can explore json on Superset, all database access on all_database_access三種權(quán)限饭于,最后一種看你需要。這種方式會將所有請求視為來自最高權(quán)限用戶维蒙,本質(zhì)其實(shí)就是【無登錄有鑒權(quán)】掰吕,但也僅針對iframe或者chart表詳情頁無需登錄,即可擁有public的權(quán)限颅痊。
需要關(guān)聯(lián)(設(shè)置為Ture)才能使頁面上對public角色的權(quán)限配置生效
為了明確殖熟,這里展示了我這邊public現(xiàn)有配置的權(quán)限??
- 如果一個web應(yīng)用想要集成superset的圖表,且要求數(shù)據(jù)接口僅對特定應(yīng)用開放斑响,那就需要修改鑒權(quán)方式菱属,將原來通過提交用戶名和密碼的鑒權(quán)方式替換為自己的應(yīng)用認(rèn)證方式。
方式如下:
2.1 繼承AuthDBView類恋捆,重寫login方法照皆,大致邏輯如下:從鏈接中獲取token->對token鑒權(quán)->成功或失敗跳轉(zhuǎn)(攜帶參數(shù));
2.2 繼承SupersetSecurityManager類沸停,將AuthDBView子類賦值給authdbview膜毁;
2.3 修改config文件,將SupersetSecurityManager子類賦值給CUSTOM_SECURITY_MANAGER。
** 鑒權(quán)類的接口我認(rèn)為都可以放在這個視圖下面瘟滨。