Authorization casbin #1

Closed
senaduka wants to merge 4 commits from authorization_casbin into master
16 changed files with 63 additions and 29 deletions
Showing only changes of commit 282b0a0ee8 - Show all commits

View File

@@ -15,6 +15,8 @@ COPY ./dist/${BIN_NAME} /opt/app/${BIN_NAME}
ADD ./dist/docs/ /opt/app/docs/ ADD ./dist/docs/ /opt/app/docs/
ADD ./dist/static/ /opt/app/static/ ADD ./dist/static/ /opt/app/static/
ADD ./dist/config.toml /opt/app/config.toml ADD ./dist/config.toml /opt/app/config.toml
ADD ./dist/authorization_model.conf /opt/app/authorization_model.conf
ADD ./dist/authorization_policy.csv /opt/app/authorization_policy.csv
# Sets and executes the app. # Sets and executes the app.
WORKDIR /opt/app WORKDIR /opt/app

View File

@@ -67,6 +67,8 @@ build: clean create-build-container
cp -R static/* ./dist/static/ cp -R static/* ./dist/static/
cp -R docs/swagger/ ./dist/docs/ cp -R docs/swagger/ ./dist/docs/
cp config.${DEPLOY_ENV}.toml ./dist/config.toml cp config.${DEPLOY_ENV}.toml ./dist/config.toml
cp authorization_model.conf ./dist/authorization_model.conf
cp authorization_policy.csv ./dist/authorization_policy.csv
################################################# #################################################
## Building, based on the current environment. ## ## Building, based on the current environment. ##

View File

@@ -1,7 +1,9 @@
p, AD, *, *, *, *, *, *, * p, AD, *, *, *, *, *, *, *
p, *, *, *, *, *, *, /v1/authenticate/portal, POST p, *, *, *, *, *, *, /v1/authenticate/portal, POST
p, *, *, *, *, *, *, /v1/notification/ws, GET
p, *, *, *, *, *, *, /health/, GET p, *, *, *, *, *, *, /health/, GET
p, *, *, *, *, *, [self], /v1/nemt/nemt/users/*/, GET p, *, *, *, *, *, *, /v1/nemt/users/contacttype, GET
p, *, *, *, *, *, [self], /v1/nemt/users/*, GET
p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, DELETE p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, DELETE
p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, POST p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, POST
p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, GET p, *, *, *, *, *, [self], /v1/nemt/users/portal/*, GET
@@ -72,6 +74,8 @@ p, SCHDAD, SCHDAD, *, *, [equal*], [other], /v1/nemt/users/portal/*, POST
p, SCHDAD, SCHDAD, *, *, [equal*], [other], /v1/nemt/users/portal/*, GET p, SCHDAD, SCHDAD, *, *, [equal*], [other], /v1/nemt/users/portal/*, GET
p, SPT, *, programsupport, *, *, [other], /v1/nemt/users/, GET p, SPT, *, programsupport, *, *, [other], /v1/nemt/users/, GET
p, SPT, *, programsupport, *, *, [other], /v1/nemt/users/*, GET p, SPT, *, programsupport, *, *, [other], /v1/nemt/users/*, GET
p, *, *, *, *, *, *, /v1/nemt/organization/name, GET
p, *, *, *, *, *, *, /v1/nemt/organization/type, GET
p, AD, *, *, *, *, *, /v1/nemt/organization/*, GET p, AD, *, *, *, *, *, /v1/nemt/organization/*, GET
p, AD, *, *, *, *, *, /v1/nemt/organization/*, POST p, AD, *, *, *, *, *, /v1/nemt/organization/*, POST
p, AD, *, *, *, *, *, /v1/nemt/organization/*, PUT p, AD, *, *, *, *, *, /v1/nemt/organization/*, PUT
@@ -88,5 +92,20 @@ p, BCBSIAD, *, *, *, *, *, /v1/nemt/organization/*, GET
p, BCBSIAD, *, *, *, *, *, /v1/nemt/organization/*, POST p, BCBSIAD, *, *, *, *, *, /v1/nemt/organization/*, POST
p, BCBSIAD, *, *, *, *, *, /v1/nemt/organization/*, PUT p, BCBSIAD, *, *, *, *, *, /v1/nemt/organization/*, PUT
p, SPT, *, programsupport, *, *, *, /v1/nemt/organization/*, GET p, SPT, *, programsupport, *, *, *, /v1/nemt/organization/*, GET
p, SP, *, provider, *, *, *, /v1/nemt/organization, GET
p, SP, *, plan, *, *, *, /v1/nemt/organization, GET
p, SPT, *, programsupport, *, *, *, /v1/nemt/organization, GET
p, SCHDAD, *, provider, *, *, *, /v1/nemt/organization, GET
p, BCBSIAD, *, bcbsi, *, *, *, /v1/nemt/organization, GET
p, BDCAD, *, techsupport, *, *, *, /v1/nemt/organization, GET
p, PLANAD, *, plan, *, *, *, /v1/nemt/organization, GET
p, AD, *, *, *, *, *, /v1/nemt/organization, GET
p, SP, *, provider, *, *, *, /v1/nemt/eligibility, POST
p, SP, *, plan, *, *, *, /v1/nemt/eligibility, POST
p, SPT, *, programsupport, *, *, *, /v1/nemt/eligibility, POST
p, SCHDAD, *, provider, *, *, *, /v1/nemt/eligibility, POST
p, BCBSIAD, *, bcbsi, *, *, *, /v1/nemt/eligibility, POST
p, BDCAD, *, techsupport, *, *, *, /v1/nemt/eligibility, POST
p, PLANAD, *, plan, *, *, *, /v1/nemt/eligibility, POST
p, AD, *, *, *, *, *, /v1/nemt/eligibility, POST
1 p AD * * * * * * *
2 p * * * * * * /v1/authenticate/portal POST
3 p * * * * * * /v1/notification/ws GET
4 p * * * * * * /health/ GET
5 p * * * * * [self] * /v1/nemt/nemt/users/*/ /v1/nemt/users/contacttype GET
6 p * * * * * [self] /v1/nemt/users/* GET
7 p * * * * * [self] /v1/nemt/users/portal/* DELETE
8 p * * * * * [self] /v1/nemt/users/portal/* POST
9 p * * * * * [self] /v1/nemt/users/portal/* GET
74 p SCHDAD SCHDAD * * [equal*] [other] /v1/nemt/users/portal/* GET
75 p SPT * programsupport * * [other] /v1/nemt/users/ GET
76 p SPT * programsupport * * [other] /v1/nemt/users/* GET
77 p * * * * * * /v1/nemt/organization/name GET
78 p * * * * * * /v1/nemt/organization/type GET
79 p AD * * * * * /v1/nemt/organization/* GET
80 p AD * * * * * /v1/nemt/organization/* POST
81 p AD * * * * * /v1/nemt/organization/* PUT
92 p BCBSIAD * * * * * /v1/nemt/organization/* POST
93 p BCBSIAD * * * * * /v1/nemt/organization/* PUT
94 p SPT * programsupport * * * /v1/nemt/organization/* GET
95 p SP * provider * * * /v1/nemt/organization GET
96 p SP * plan * * * /v1/nemt/organization GET
97 p SPT * programsupport * * * /v1/nemt/organization GET
98 p SCHDAD * provider * * * /v1/nemt/organization GET
99 p BCBSIAD * bcbsi * * * /v1/nemt/organization GET
100 p BDCAD * techsupport * * * /v1/nemt/organization GET
101 p PLANAD * plan * * * /v1/nemt/organization GET
102 p AD * * * * * /v1/nemt/organization GET
103 p SP * provider * * * /v1/nemt/eligibility POST
104 p SP * plan * * * /v1/nemt/eligibility POST
105 p SPT * programsupport * * * /v1/nemt/eligibility POST
106 p SCHDAD * provider * * * /v1/nemt/eligibility POST
107 p BCBSIAD * bcbsi * * * /v1/nemt/eligibility POST
108 p BDCAD * techsupport * * * /v1/nemt/eligibility POST
109 p PLANAD * plan * * * /v1/nemt/eligibility POST
110 p AD * * * * * /v1/nemt/eligibility POST
111

View File

@@ -19,6 +19,8 @@ pipelines:
- cp -R static/* ./dist/static/ - cp -R static/* ./dist/static/
- cp -R docs/swagger/ ./dist/docs/ - cp -R docs/swagger/ ./dist/docs/
- cp config.prd.toml ./dist/config.toml - cp config.prd.toml ./dist/config.toml
- cp authorization_model.conf ./dist/authorization_model.conf
- cp authorization_policy.csv ./dist/authorization_policy.csv
- docker build -f Dockerfile.run -t nemt-portal-api-run:prod --force-rm --build-arg BIN_NAME=nemt-portal-api --build-arg APP_NAME=nemt-portal-api . - docker build -f Dockerfile.run -t nemt-portal-api-run:prod --force-rm --build-arg BIN_NAME=nemt-portal-api --build-arg APP_NAME=nemt-portal-api .
- apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean - apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean
- apt-get install python3-pip -y - apt-get install python3-pip -y
@@ -46,6 +48,8 @@ pipelines:
- cp -R static/* ./dist/static/ - cp -R static/* ./dist/static/
- cp -R docs/swagger/ ./dist/docs/ - cp -R docs/swagger/ ./dist/docs/
- cp config.stg.toml ./dist/config.toml - cp config.stg.toml ./dist/config.toml
- cp authorization_model.conf ./dist/authorization_model.conf
- cp authorization_policy.csv ./dist/authorization_policy.csv
- docker build -f Dockerfile.run -t nemt-portal-api-run:dev --force-rm --build-arg BIN_NAME=nemt-portal-api --build-arg APP_NAME=nemt-portal-api . - docker build -f Dockerfile.run -t nemt-portal-api-run:dev --force-rm --build-arg BIN_NAME=nemt-portal-api --build-arg APP_NAME=nemt-portal-api .
- apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean - apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get -y autoremove && apt-get clean
- apt-get install python3-pip -y - apt-get install python3-pip -y

View File

@@ -37,6 +37,7 @@ db = 0
pass = "3rdaP3KL2x%V" pass = "3rdaP3KL2x%V"
prefix = "nemt-portal-api-dev" prefix = "nemt-portal-api-dev"
default-expiration = "5m" default-expiration = "5m"
master-name = "devmaster01"
[log] [log]
log-to-file = false log-to-file = false

View File

@@ -37,6 +37,7 @@ db = 0
pass = "3rdaP3KL2x%V" pass = "3rdaP3KL2x%V"
prefix = "portal-api-prod" prefix = "portal-api-prod"
default-expiration = "5m" default-expiration = "5m"
master-name = "master01"
[log] [log]
log-to-file = false log-to-file = false

View File

@@ -37,6 +37,7 @@ db = 0
pass = "3rdaP3KL2x%V" pass = "3rdaP3KL2x%V"
prefix = "portal-api-test" prefix = "portal-api-test"
default-expiration = "5m" default-expiration = "5m"
master-name = "devmaster01"
[log] [log]
log-to-file = false log-to-file = false

View File

@@ -80,7 +80,9 @@ func (c *notificationRepo) getQuery() string {
INNER JOIN tab_login e INNER JOIN tab_login e
ON c.user_id = e.user_id ON c.user_id = e.user_id
INNER JOIN tab_login f INNER JOIN tab_login f
ON d.user_id = f.user_id` ON d.user_id = f.user_id
INNER JOIN tab_ride g
ON g.ride_id = a.ride_id `
} }
func (c *notificationRepo) GetLastNotificationFromPhoneNumber(notificationType string, phoneNumber string, status string) (entity.Notification, error) { func (c *notificationRepo) GetLastNotificationFromPhoneNumber(notificationType string, phoneNumber string, status string) (entity.Notification, error) {

View File

@@ -784,7 +784,7 @@ func (c *userRepo) getAddressSecondaryData(address entity.Address) (entity.Addre
// GetAll returns a list of all active cards // GetAll returns a list of all active cards
func (c *userRepo) GetAll() (list []entity.User, err error) { func (c *userRepo) GetAll() (list []entity.User, err error) {
return c.parseSet(c.conn.Query(c.getQuery() + " AND a.active = 1 ")) return c.parseSet(c.conn.Query(c.getQuery() + " WHERE a.active = 1 "))
} }
// GetByID returns a single card data by its ID // GetByID returns a single card data by its ID

View File

@@ -44,3 +44,5 @@ import:
version: ~1.5.0 version: ~1.5.0
- package: github.com/Knetic/govaluate - package: github.com/Knetic/govaluate
version: 9aa49832a739dcd78a5542ff189fb82c3e423116 version: 9aa49832a739dcd78a5542ff189fb82c3e423116
- package: github.com/pkg/errors
version: ^0.8.0

View File

@@ -31,10 +31,11 @@ type RedisCache struct {
func Instance(cfg *config.Config) contract.CacheManager { func Instance(cfg *config.Config) contract.CacheManager {
once.Do(func() { once.Do(func() {
client := redis.NewFailoverClient(&redis.FailoverOptions{ client := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "master01", MasterName: cfg.Cache.Master,
SentinelAddrs: []string{fmt.Sprintf("%s:%v", cfg.Cache.Server, cfg.Cache.Port)}, SentinelAddrs: []string{fmt.Sprintf("%s:%v", cfg.Cache.Server, cfg.Cache.Port)},
Password: cfg.Cache.Pass, Password: cfg.Cache.Pass,
DB: cfg.Cache.DB, DB: cfg.Cache.DB,
MaxRetries: 10,
}) })
instance = &RedisCache{cfg, client} instance = &RedisCache{cfg, client}

View File

@@ -119,6 +119,7 @@ type CacheConfig struct {
Pass string Pass string
Prefix string Prefix string
DefaultExpiration time.Duration DefaultExpiration time.Duration
Master string
} }
// CacheConfig represents the configuration values about the documentation config. // CacheConfig represents the configuration values about the documentation config.
@@ -194,6 +195,7 @@ func Read() (*Config, error) {
Pass: viper.GetString("cache.pass"), Pass: viper.GetString("cache.pass"),
Prefix: viper.GetString("cache.prefix"), Prefix: viper.GetString("cache.prefix"),
DefaultExpiration: viper.GetDuration("cache.default-expiration"), DefaultExpiration: viper.GetDuration("cache.default-expiration"),
Master: viper.GetString("cache.master-name"),
}, },
Lyft: LyftConfig{ Lyft: LyftConfig{
Client: viper.GetString("lyft.key"), Client: viper.GetString("lyft.key"),

View File

@@ -104,8 +104,8 @@ func (c *controller) handleParticipating(ctx echo.Context) error {
// long = -87.624225 // long = -87.624225
// } // }
lat = 40.442875 lat = 41.819078
long = -80.003112 long = -87.623129
if len(mukID) > 0 { if len(mukID) > 0 {
query = "" query = ""
@@ -152,8 +152,8 @@ func (c *controller) handleList(ctx echo.Context) error {
providerParams := npdmodel.ProviderSearchParams{ providerParams := npdmodel.ProviderSearchParams{
Name: name, Name: name,
SearchBy: searchBy, SearchBy: searchBy,
Latitude: 40.442875, Latitude: 41.819078,
Longitude: -80.003112, Longitude: -87.623129,
Distance: distance, Distance: distance,
Limit: limit, Limit: limit,
Offset: 0, Offset: 0,

View File

@@ -1,6 +1,8 @@
package serverconfig package serverconfig
import ( import (
"fmt"
"bitbucket.org/nemt/nemt-portal-api/application/applicationservice" "bitbucket.org/nemt/nemt-portal-api/application/applicationservice"
"bitbucket.org/nemt/nemt-portal-api/application/viewmodel" "bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
"bitbucket.org/nemt/nemt-portal-api/infra/auth" "bitbucket.org/nemt/nemt-portal-api/infra/auth"
@@ -114,22 +116,28 @@ func (a *Config) policyObjectAttributes(c echo.Context, userDetails viewmodel.Us
var object interface{} var object interface{}
objectIsNew := len(c.ParamValues()) <= 1 const userIDParamName = "user_uuid"
objectIsExisting := len(c.ParamValues()) > 1 existingUser := strings.Contains(c.Request().URL.Path, "/users/") && c.Param(userIDParamName) != ""
newUser := strings.Contains(c.Request().URL.Path, "/users/") && c.Param(userIDParamName) == ""
existingUser := strings.Contains(c.Request().URL.Path, "/users") && objectIsExisting const organizationIDParamName = "org_uuid"
newUser := strings.Contains(c.Request().URL.Path, "/users") && objectIsNew existingOrganization := strings.Contains(c.Request().URL.Path, "/organization") && c.Param(organizationIDParamName) != ""
newOrganization := strings.Contains(c.Request().URL.Path, "/organization") && c.Param(organizationIDParamName) == ""
existingOrganization := strings.Contains(c.Request().URL.Path, "/organization") && objectIsExisting fmt.Println("**********")
newOrganization := strings.Contains(c.Request().URL.Path, "/organization") && objectIsNew fmt.Printf("url %v\n", c.Param(userIDParamName))
fmt.Printf("user %v\n", userDetails.ID)
fmt.Printf("existing %v\n", existingUser)
fmt.Printf("new %v\n", newUser)
fmt.Println("**********")
switch { switch {
case existingUser: case existingUser:
object, _ = a.Svc.Users.GetByUUID(c.ParamValues()[1], "") object, _ = a.Svc.Users.GetByUUID(c.Param(userIDParamName), "")
case newUser && len(userDetails.Organizations) > 0: case newUser && len(userDetails.Organizations) > 0:
object = userDetails object = userDetails
case existingOrganization: case existingOrganization:
object, _ = a.Svc.Organization.GetByUUID(c.ParamValues()[1], userDetails) object, _ = a.Svc.Organization.GetByUUID(c.Param(organizationIDParamName), userDetails)
case newOrganization: case newOrganization:
object = viewmodel.Organization{} object = viewmodel.Organization{}
} }

View File

@@ -1,11 +0,0 @@
[request_definition]
r = role, obj, act
[policy_definition]
p = role, obj, act
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = keymatch(r.role, p.role) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")

View File

@@ -18,7 +18,7 @@ func SetMiddlewares(server *echo.Echo, cfg *config.Config, log *logger.Logger, s
setCORSMiddleware(server, cfg) setCORSMiddleware(server, cfg)
setBodyLimitMiddleware(server) setBodyLimitMiddleware(server)
setRateLimitMiddleware(server) setRateLimitMiddleware(server)
setAuthorizationMiddleware(server, log, cfg, appsvc) //setAuthorizationMiddleware(server, log, cfg, appsvc)
err := setJWTMiddleware(server, cfg) err := setJWTMiddleware(server, cfg)
if err != nil { if err != nil {