Authorization casbin #1
@@ -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
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -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. ##
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
|
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
3
infra/cache/cache.go
vendored
3
infra/cache/cache.go
vendored
@@ -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}
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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{}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 == "*")
|
|
||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user