From 616917393681084195d37514db5e568d30ff9e16 Mon Sep 17 00:00:00 2001 From: Yana Date: Mon, 19 Jun 2023 14:14:21 +0200 Subject: [PATCH] add adm auth --- __pycache__/main.cpython-310.pyc | Bin 804 -> 779 bytes __pycache__/routes.cpython-310.pyc | Bin 511 -> 496 bytes components/__pycache__/__init__.cpython-310.pyc | Bin 163 -> 138 bytes components/k2auth/.gitignore | 8 ++ components/k2auth/k2auth/models.py | 81 +++++++++++++++++++++ components/k2auth/k2auth/views.py | 53 ++++++++++++++ components/k2auth/requirements.txt | 47 ++++++++++++ .../k2test/__pycache__/__init__.cpython-310.pyc | Bin 170 -> 145 bytes .../k2test/__pycache__/__init__.cpython-310.pyc | Bin 177 -> 152 bytes .../k2test/__pycache__/views.cpython-310.pyc | Bin 1980 -> 1955 bytes k2/__pycache__/__init__.cpython-310.pyc | Bin 155 -> 130 bytes k2/__pycache__/k2cfg.cpython-310.pyc | Bin 2754 -> 2729 bytes k2/__pycache__/k2comp.cpython-310.pyc | Bin 1975 -> 1950 bytes k2/__pycache__/k2obj.cpython-310.pyc | Bin 506 -> 481 bytes k2/__pycache__/k2rout.cpython-310.pyc | Bin 12786 -> 12767 bytes main.py | 3 +- routes.py | 17 ++++- 17 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 components/k2auth/.gitignore create mode 100644 components/k2auth/k2auth/models.py create mode 100644 components/k2auth/k2auth/views.py create mode 100644 components/k2auth/requirements.txt diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc index 712a63a20dcf04d87dd7209db7f26ebbf09e7582..b6eabe74f06438de1788479df728663dec7688ac 100644 GIT binary patch delta 64 zcmZ3&*3HJ7&&$ij00iZ76H>NsIHtHvw>-ZnJ0_qq mIU}(sH=rm#D>b>KI40YuC_lf%2ujCHKFws!$|S_d@*e;wQXXXh diff --git a/__pycache__/routes.cpython-310.pyc b/__pycache__/routes.cpython-310.pyc index 30f4064e70a28815ab36043698f1955b5cf5b4bf..086743dd3c175c75acd601cf1b327e2461e084ca 100644 GIT binary patch delta 195 zcmey*{DGM-pO=@50SFjfCZxnLP2{_-!jXpHCdlgCG(bCa(-?>eqL%`NwFS8CyXk~Of4@iVgqTAKvD!W zP7j13((FL#l?+9EKnhI!Qqa%H&rQ{@Ow3EvH?%Y`13ITDKfgqO@ XUt$EMV~QppW>jNmLturL4sUKAN6 delta 83 zcmeBTT+GOw&&$ij00b;-%@et8Y}}l!VnT~ki;824%XG{0i?U+^Dw8u3i*f^s^0QKt eONwK%jf(Q~ON^j&Omcp1L4ICp9#CdtmI43;avT%@ diff --git a/components/k2auth/.gitignore b/components/k2auth/.gitignore new file mode 100644 index 0000000..408f575 --- /dev/null +++ b/components/k2auth/.gitignore @@ -0,0 +1,8 @@ + idea +__pycache__/ +*/__pycache__/ +*.py[cod] +.pyc +.idea/ +venv + diff --git a/components/k2auth/k2auth/models.py b/components/k2auth/k2auth/models.py new file mode 100644 index 0000000..9d95cdd --- /dev/null +++ b/components/k2auth/k2auth/models.py @@ -0,0 +1,81 @@ +import uuid +from sqlalchemy import Column, Integer, String +from sqlalchemy.ext.declarative import declarative_base +from flask_jwt_extended import create_access_token +from datetime import timedelta +import hashlib +from flask import current_app as k2 + +Base = declarative_base() + +class k2users(Base): + __tablename__ = 'k2users' + user_id = Column(Integer, primary_key=True) + login = Column(String(50)) + name = Column(String(50)) + email = Column(String(150)) + password = Column(String(50)) + phone = Column(String(20)) + roleid = Column(String(50)) + + def __init__(self, **kwargs): + self.user_id = hashlib.md5(str(uuid.uuid4()).encode()).hexdigest() + self.login = kwargs.get('login') + self.password = hashlib.md5(kwargs.get('password').encode()).hexdigest() + self.name = kwargs.get('name') + self.email = kwargs.get('email') + self.phone = kwargs.get('phone') + self.roleid = kwargs.get('roleid') + + def get_token(self, expire_time=24): + expires_delta = timedelta(expire_time) + token = create_access_token(identity=self.user_id, expires_delta=expires_delta) + if self.roleid == '1': + role = 'admin' + else: + role = "client" + + userData = { + "avatar": "/src/assets/images/avatars/avatar-4.png", + "email": self.email, + "fullName": self.name, + "id": self.user_id, + "role": role, + "username": self.login + + } + if self.roleid != '1': + userAbilities = [ + { + "action": "read", + "subject": "Auth"}, + + { + "action": "read", + "subject": "AclDemo"} + ] + else: + userAbilities = [ + { + "action": "manage", + "subject": "all" + } + ] + return (token, userData, userAbilities) + + + @classmethod + def authenticate(cls, login, password): + session = k2.extensions['sqlalchemy'].db.session + user = '' + try: + user = session.query(cls).filter(cls.login == login).filter(cls.password == hashlib.md5(password.encode()).hexdigest()).one() + except: + user = None + return user + + @classmethod + def user_by_login(cls, login): + session = k2.extensions['sqlalchemy'].db.session + user = session.query(cls).filter(cls.login == login).first() + return user diff --git a/components/k2auth/k2auth/views.py b/components/k2auth/k2auth/views.py new file mode 100644 index 0000000..ac5e7d5 --- /dev/null +++ b/components/k2auth/k2auth/views.py @@ -0,0 +1,53 @@ +# import hashlib +# import uuid +from flask import Blueprint, request, jsonify +from flask import current_app as k2 +from flask_jwt_extended import jwt_required + +from .models import k2users + +k2auth = Blueprint('k2auth', __name__, template_folder='templates', static_folder='static', static_url_path='/adm') + + +class Auth(): + def __init__(self): + pass + + def register(self): + params = request.json + session = k2.extensions['sqlalchemy'].db.session + try: + user = k2users(**params) + session.add(user) + session.commit() + token = user.get_token() + + return {'access_token': token} + except: + return jsonify({'error': 'Unauthorized'}), 401 + + + def login(self): + params = request.json + user = k2users.authenticate(**params) + if user: + token, userData, userAbilities = user.get_token() + return {'accessToken': token, "userData": userData, "userAbilities": userAbilities} + else: + k2.logger.error(('%s failed to log in ', params.get('login'), params.get('password'))) + return jsonify({'error': 'Unauthorized'}), 401 + + + @jwt_required() + def logout(self): + response = { + 'message': 'Logged out successfully' + } + return jsonify(response) + + + +auth = Auth() +k2auth.add_url_rule('/login', methods=['POST'], view_func=auth.login) +k2auth.add_url_rule('/logout', methods=['GET'], view_func=auth.logout) +k2auth.add_url_rule('/register', methods=['POST'], view_func=auth.register) diff --git a/components/k2auth/requirements.txt b/components/k2auth/requirements.txt new file mode 100644 index 0000000..85526b6 --- /dev/null +++ b/components/k2auth/requirements.txt @@ -0,0 +1,47 @@ +alembic==1.11.1 +Babel==2.12.1 +bcrypt==4.0.1 +bidict==0.22.1 +blinker==1.6.2 +certifi==2023.5.7 +charset-normalizer==3.1.0 +click==8.1.3 +colorama==0.4.6 +dnspython==2.3.0 +email-validator==2.0.0.post2 +Flask==2.3.2 +flask-babel==3.1.0 +Flask-Bcrypt==1.0.1 +Flask-Cors==3.0.10 +Flask-JWT-Extended==4.5.2 +Flask-Login==0.6.2 +Flask-Migrate==4.0.4 +Flask-MySQLdb==1.0.1 +Flask-SQLAlchemy==3.0.3 +flask-staticdirs==1.0.1 +Flask-WTF==1.1.1 +greenlet==2.0.2 +idna==3.4 +itsdangerous==2.1.2 +Jinja2==3.1.2 +jsonify==0.5 +Mako==1.2.4 +MarkupSafe==2.1.2 +mysql==0.0.3 +mysql-connector==2.2.9 +mysql-connector-python==8.0.33 +mysqlclient==2.1.1 +peppercorn==0.6 +protobuf==3.20.3 +PyJWT==2.7.0 +python-engineio==4.4.1 +python-socketio==5.8.0 +pytz==2023.3 +PyYAML==6.0 +requests==2.31.0 +six==1.16.0 +SQLAlchemy==2.0.15 +typing_extensions==4.6.2 +urllib3==2.0.2 +Werkzeug==2.3.4 +WTForms==3.0.1 diff --git a/components/k2test/__pycache__/__init__.cpython-310.pyc b/components/k2test/__pycache__/__init__.cpython-310.pyc index ba41e6002294e9e360595c1682451f2b80133406..e05adfbe3cddce8d3a58f343cff86fcce5358d84 100644 GIT binary patch delta 65 zcmZ3*IFXS%pO=@50SF#QPMFATqh+F>k)NBYUzwPfsBdU#V5XmKRFt1zqMw|fTacfZ SnpaW`6e&q9F43RZr2qg>6cj}O delta 90 zcmbQpxQdZGpO=@50SF2Xc1`5AarSk#iU}=FEh>&FF4HZ~FUpPys7%gCEXoZi%Fjwo jE-8-5HY&=`FEN7BG0FM41^IcYd0?56)Z&tuiG>OPH{Bo} diff --git a/components/k2test/k2test/__pycache__/__init__.cpython-310.pyc b/components/k2test/k2test/__pycache__/__init__.cpython-310.pyc index ac7fe2481c7e3d94e968794eb9be34b37a363338..daea48ee5247d2cbc796cd7cdf7bd459b741f9bd 100644 GIT binary patch delta 72 zcmdnUID?TppO=@50SF#QPMFATV`#0Pk)NBYUzwPfsBdU#V5XmKRFt1zqMw|fTacfZ TnpaW`6e&q9E`d=KCn^8{?k*Pe delta 97 zcmbQixRH@NpO=@50SF2Xc1`5A@d|OaiU}=FEh>&FF4HZ~FUpPys7%gCEXoZi%Fjwo mE-8-5HY&=`FEN7BG0FM41^IcYd0?56)Z!AL1elswp#T6a6e9Wn diff --git a/components/k2test/k2test/__pycache__/views.cpython-310.pyc b/components/k2test/k2test/__pycache__/views.cpython-310.pyc index 5488ce4241e381adfbf8cce9fabf541d6797f5cc..0aa7ab1e0499dbd75b80d59f68732d206dc48a3c 100644 GIT binary patch delta 223 zcmdnPznGsdpO=@50SF#QPDpvqx{>cClc9xvMt*Lpeq~}_qQ0S}fth}`QBi(=iGFf^ zZb5!tYFhdkssmE23nC0bgfWP)1e)yw0Q*lpzW@LL delta 244 zcmZ3?zlWbMpO=@50SLVI^`%I$ZRC5&_6%$&VT2vfUT&7!|Uz8maP??;OSd<%3 zl%JKFTv8m9ZB&$>Ut$EMW0Lc83-a?)^T0ACsl_Eg2{1KTgLxZc)a3ijPK?@n-u9!4rSG0GX#nj8BK0yO$Hk9 znl(qp1SDV#ByMpeXJqE26s6`Bu>rZ7j755ri`gs~%_py6GX^Stz?LMc4N|NFA`C!; M5r{CK9M0|o0K;fT2><{9 diff --git a/k2/__pycache__/__init__.cpython-310.pyc b/k2/__pycache__/__init__.cpython-310.pyc index b56425d4cd3dbb7ba2d37b6c0acae62ab77d3c83..36cca7db1f16af712ea22805dcee039aa2f68b82 100644 GIT binary patch delta 50 zcmbQu*u==4&&$ij00a*tCrsqFkyh2u$j?pHuT0EK)Hk#=Fw@UAD$36<0aE%Cs}%q| C1r5aj delta 104 zcmZo-oXyCc&&$ij00fWC+a_|`gxEP-#e^2878S=7m+6-07iGr;R3>L67Uc#Mkx>A%cpO=@50SF#QPDuI0xsflCNm@xiBR@A)zcMi|QQy$gz)U~es3p_5x_ad3J5iTWl#wd5O8Hw0wNSagb#@Dm|Vye F2mnhdQpErO delta 335 zcmZ1}dPtNnpO=@50SKz!^`+QyZRAU2GO>2HiU}=FEh>&FF4HZ~FUpPys7%gCEXoZi z%FjwoE-8-5HY&=`FEN7BKq_W(7t>S5sL2J)j~T@_hp@OYii!aZy~RhzBe+`7GNDpb6X9wK=2MQj+o#b5o-xzhc)` zk77F8T0w{VSIlzE%aZpz#9oX114CCb`eLgoI$;T_MBUh~sX+*gvDCzlx zXLRwq?2cGS-8(Px+{Q`0?T(wAF`+M4-lG}9(l)kH?yX{U5h}=O>e(sjK3)dw0CoWt zz#afx7r^o~{ZL5MAaoGl|E(n|EWgrYRFoZa>o~7V${P5Apj;U~QRcwsv3N-(P0Hf* z24>#)>o7O3YgI@V0f&I2KN<*I8p+6QS+%;;nhuq9&Vor8DeF>jKN|8J2pfR^UZ^q` zdU;oVNV$9XJ`Dg-qgaj+_0#kf$L5BPSy&v%?4tbdPS=|MO&*egL&zai#zO delta 491 zcmZWl&r1S97;XKrE4ix>E|FQ7rDY|Ud5SLOrAs74AhKYaJE^(u)HiD(bmr!Oja86uL%r&}^H~s{%bCO_v$n5>V=ves-}L+?K8+mA^@| zQsPMq)Ff$|9|!M3bHb2+29r^A_U%FC+0ac21(+9*mtgT%^Sf0366&VXqWGYA0qe+9 z7-6hK9WQ*=Colk=?}evkaH=i?ImO_Ue=V-VhlOPQ^S_CF&bm8kp&48x`f}mjEgK$z6;d8gP|hilaESq$DvZCpBu~r3m&YmfY05(x}OXjM8=@ zKy^hR;+M6vRZM7cYEf}aahYy;eo=NzKxJ}9Vo`2DQGQlxa!GMawoy@jeu)v322wGT j3mH8$;6{MWDG~)5c8kL%H$SB`C)JJ-$SY<75<(0BE2%9O diff --git a/k2/__pycache__/k2rout.cpython-310.pyc b/k2/__pycache__/k2rout.cpython-310.pyc index 70c1c4abb2bf6a02930c16ea412340bf6b594c92..b55cbe90a086ee068ac91e62503e95ab83da967d 100644 GIT binary patch delta 2338 zcmb7`Z){Ul6u@`i+PAG;yFy!B_s31xAKtpP8^~bbbdzO<42HnWW^gNA`?@{$_FC?H z-GEFc5WxhA!xIvX@!ux{8VQzwiF^T-pe`5@V{&7nelW%lelfu>^2d8_N4qR);*$M( z@45G!d(WSH+CO4H#@tDl%Td7pehSRRW82QVn{1Vm37pI#w`KFx&t`uIjP|Ln}##J*$wUnhL4TUhfo}5-G-HApCMJqIbs6fWbPUB2#2&<6gfN|eFFZk_XKs6LlLgyP1ney_+z`+0!kExRZYm-&&Zn=VNP~6W zFzEo*yOA(>$GauC1I5p9u%aoInmoJ%XJp#(KuRqfO(H1xeACLm`9LSohLkj!4J(Om zgbTi2(hh(5o~lKUm^($2d)1f~NhI|+&)p&qVbtGP#!AODD?-&&GLoh`gV+4^)t#v5 zGSumOtQk=sM1%Qf$XsS{#n;mRkH!z^kp}w$edWxrM=jN~@@Fi(lUspC9;!Qm2C@%U zRSZ=asAD2>LCZ!a4W}!94gF_i=rro>M{GnKgtL_jIRv*V!)rz9&7$-L#9>4+;s|0< z0&qHoI124m1G6vkq2kHb%P|x$3Mrp5XOzaqwJ86a0h4*CiL>rtW!a8|!1zsJW1*FjgMKl54jY2sYuDa31POK12x zE2L>dDP%BL6Xb<=xu#b>k7_ks&6laFogq8&YVY$Ex*D}?RE@@&!%XR#rE7+2(p-=g zJ3WV6TzQwYxJl82g%>n}Jj z;mSUQ0b3gqJ^4fNV!~s32uJ^PuswUQNI^a$C*jYA9&$Casc|=%&D#@B4-T5 j_7I94fnG#hL0m;#LtID9BW@yuZ+Pi!W<+{mv~BKh5hFoP delta 2363 zcma)-e{54#6vunJ?yXzbt+IBoA7lgegSV~i7(-xe{0PhVy}^e3coe$Q_qvvL@74QW z*{H*b0wyMgA16SR1Tbjg5&@yp1Wh#jVf+uHi6%BC{^1`=h|!psm>9r&?i=m0pmEJU z@BTXH-1EKX-S=bok8qjhbe34yU%c;(yk_8bS&OZ+dt+DN1zn+fKtJjo(`Y=f^H?|< zqN6*hc0>sqdLZ6GHO=Uld9p_!Gi2+xx+JGE9@CAOIuevaMo5C&!ZzZAN5Uf_!QVwS zjPvcoq#MTVl&ph?_N(q57Mr>mvi4+1*I77Of-A)tvK|IYHj+NLSaOJLfImxoWD_(v zmJ3_ZU~T50;{5I9}G|-;K@Z5JL=7MI@Fm6spLjHra*I(RI-KireGaqkTR0SENQ>wKdMeyZ z)4_@^cD8R;Y-!z&^E(-`MMqf)#WZ#IltA&I_$VF4)(9dF#62edTTWC#A68Az+L9q7 zN>{-IRV2UOrIOS<9>|#zNxaFBohT%)k z1Ua4Qt^CSrrtJH_DgS`G4a1?TZ3`q%B4jAKkw3+mLcdql%w%{_)kKbft9oB`6m1fS zoFHb_D!f|#v+qB%rb)DW5wQxP!=)OLjKRGc|8ib%<2ZT@kw(}NFCk`$i(L&d0ZVFk zPrl5WqRXs}NgSS~9_vbu5DiCTM-`NgyOCVELJdZ=gsf1h^ywOYASanwwlEw`sd1?& z9ZNFhBeV@&zlK2N=_v%(o|O*6U$s|+ORSw<0j@fC=EH>-iDOo#u&b`VG{xq#1vI6K z1ri*uYh^_>Ro6$ZW`3``Fnjf7IJ>B(HK(FjNUtzU$(i4COx7uGaprY^?-uPP*E7Dw z3Bpe3@{%D>oK1@6-I28=VyeRKgDxm&_`tBectyJ&R;5rx%Fk=}e%+!dFWOKxVCHXk69d4D{MSxTc*%8(WGXv&BsvH~47sG{VnDJ#fILSgq6rb#a# zcmd5M%nOLeeg&saAaX}-W?Btav4`A&_2RkStvG)T5oC~r!zshiRI!NW&Tr0rMyGJG zjX^A!Db(}61>kLIBN>od?oaZJ&{_UYNqhWM8P!+?%SuvFWkn6g6x}bCn9+h-B$A%z z56SYJ`QoSZDw{Svcym>hH)nc?4qA#KJ1xzO{L+8MKFm~j0?)(!*7`=&Nh-^^49c;v zVQR!L}4Ha$8WID5^%|%?>aD>lo$JP!w;H@S7Fz#KpcaC6Y6kLQ~fv3A;Exx(c zY%J^0jgXPj*?q;{;QeewEX>;Q+idD;exT0#`pI1w@b%Ze$5+ff7#?Ro+_TTGqHnVm zUl8_<#N(M~6$l@pAHf6Px3!c_RrXy*h$Yob-QmV zFUebIQj8{r@s4n0gzF~>tj)fYJS7Q|?QVgmo`N^p`zCwQB#o#=__#6EQmkIPabO*y r53vOiK;T!8o<>|kTt!?*+(6t!+(Bdz(}=qW%$DM&XPp=fEIa!Tq-i)o diff --git a/main.py b/main.py index c967ee3..420ab60 100644 --- a/main.py +++ b/main.py @@ -25,8 +25,9 @@ babel.init_app(app, locale_selector=k2.get_locale) # flask routing from routes import * + if __name__ == '__main__': - app.run(debug=True, port=5000) + app.run(debug=True, port=5100) diff --git a/routes.py b/routes.py index 1251a2e..889322a 100644 --- a/routes.py +++ b/routes.py @@ -4,7 +4,16 @@ from k2.k2rout import components_bp app.register_blueprint(components_bp) from components.k2test.k2test.views import k2test app.register_blueprint(k2test, url_prefix='/k2test') -from components.grid.grid.views import grid -app.register_blueprint(grid, url_prefix='/grid') -from components.vue.vue.views import vue2 -app.register_blueprint(vue2, url_prefix='/') + +# from components.grid.grid.views import grid +# app.register_blueprint(grid, url_prefix='/grid') +# from components.vue.vue.views import vue2 +# app.register_blueprint(vue2, url_prefix='/') + + +from components.k2auth.k2auth.views import k2auth +app.register_blueprint(k2auth, url_prefix='/k2auth') + + +from components.adm.adm.views import adm +app.register_blueprint(adm, url_prefix='/adm') \ No newline at end of file -- 1.9.1