policy

package
v0.0.0-...-3eafb10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 31, 2023 License: MIT Imports: 13 Imported by: 2

README

policy based access control

Package policy 实现基于策略访问控制。

pbac 通过策略限制访问权限,每个策略拥有多条描述,按照顺序依次匹配,命中则执行effect。

pbac条件直接使用And关系,允许使用多种多样的方法限制请求,额外条件可以使用policy.RegisterCondition函数注册条件。

如果一个策略Statement的Data属性不为空,则为数据权限,在没有匹配到一个非数据权限时会通过鉴权,保存多数据权限的Data Expression,用户对指定表操作时生产对应的表数据限定sql。

PolicyExample

{
	"policy_id": 1,
	"policy_name": "PolicyExample",
	"description": "show polict all example",
	"statement": [
		{
			"effect": true,
			"action": ["*:*:Get*"],
			"resource": ["users/*",	"groups/*"],
			"conditions": {
				"and": {},
				"or": {},
				"method": ["GET", "POST", "OPTIONS"],
				"sourceip": ["127.0.0.1", "192.168.0.0/24"],
				"time": {"before": "2020-01-01", "after": "2222-01-01"},
				"params": {
					"user_id": ["1", "2"],
					"group_id": ["1"]
				}
			},
			"data": [
				{"kind": "and",	"data": []},
				{"kind": "or",	"data": []},
				{"kind": "value", "name": "user_id", "value": ["value:param:Userid"]},
				{"kind": "value", "name": "user_id", "not": true, "value": ["value:param:Userid"]},
				{"kind": "range", "name": "group_id", "min": "1", "max": "4"},
				{"kind": "sql", "name": "group_id", "sql": "group_id in %s", "value": ["1", "3"]}
			],
			"sql": [
				{
					"schema":"",
					"table":"",
					"disable": ["password","salf"],
					"conditions": [
						{"expr":"creat_time<now()-3d"},
						{"expr":"user_id=?", "values": ["value:param:Userid"] }
					]
				},
				{
					"schema":"",
					"table":"Accopt:UserMenu",
					"conditions": [{"expr": "MenuName='Home'"} ]
				}
			],
			"fitle": [
				{
					"package":"",
					"name":"",
					"rows":[
						{"creat_time": "now-3d", } 
					],
					"cloumns": [
						{"field": "email", "action": "zero", }
					]
				}
			]
		}
	]
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	BearerPrefix           = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.`
	ErrVerifyTokenInvalid  = errors.New("error: incorrect of results from token parsing")
	ErrVerifyResultInvalid = errors.New("error:jwt validation error")

	// ErrFormatPolcyUnmarshalError 定义策略json解析错误。
	ErrFormatPolcyUnmarshalError = "policy unmarshal json error: %v"
	// ErrFormatDataParseError 定义策略数据解析错误。
	ErrFormatDataParseError = "policy data parse %s error: %v"
	// ErrFormatConditionsUnmarshalError 定义策略条件json解析错误。
	ErrFormatConditionsUnmarshalError = "policy conditions unmarshal json %s error: %v"
	// ErrFormatConditionsParseError 定义NewConditions解析策略条件错误。
	ErrFormatConditionsParseError = "policy conditions parse %s error: %v"
	// ErrFormatConditionParseError 定义策略指定条件解析错误。
	ErrFormatConditionParseError = "policy conditions %s parse %s error: %v"
)

Functions

This section is empty.

Types

type Condition

type Condition interface {
	Match(ctx eudore.Context) bool
}

Condition 定义策略使用的条件。

func NewConditions

func NewConditions(data map[string]json.RawMessage) ([]Condition, error)

NewConditions 方法解析多个策略条件。

type ControllerAction

type ControllerAction struct{}

ControllerAction 定义生成action参考控制器。

func (ControllerAction) ControllerParam

func (ControllerAction) ControllerParam(pkg, name, method string) string

ControllerParam 方法定义ControllerAction生成action参数。

type Member

type Member struct {
	UserID      int       `json:"user_id" alias:"user_id"`
	PolicyID    int       `json:"policy_id" alias:"policy_id"`
	Index       int       `json:"index" alias:"index" description:"越大优先级越高,如果小于0移除授权"`
	Description string    `json:"description,omitempty" alias:"description"`
	Expiration  time.Time `json:"expiration,omitempty" alias:"expiration"`
	Policy      *Policy   `json:"-" alias:"-"`
}

Member 定义Policy授权对象。

type Policy

type Policy struct {
	PolicyID    int         `json:"policy_id" alias:"policy_id"`
	PolicyName  string      `json:"policy_name,omitempty" alias:"policy_name"`
	Description string      `json:"description,omitempty" alias:"description"`
	Statement   []Statement `json:"statement" alias:"statement"`
}

Policy 定义一个策略.

func NewPolicy

func NewPolicy(body string) (*Policy, error)

NewPolicy 方法使用字符串创建一个策略。

type Policys

type Policys struct {
	Policys sync.Map // policyid:policy
	Members sync.Map // userid:policys
	// 默认使用jwt sha1进行签名,默认值:NewSignaturerJwt([]byte("eudore")),
	Signaturer Signaturer
	// 获取请求action的函数
	// 默认返回action param
	ActionFunc func(eudore.Context) string
	// 获取请求资源的函数
	// 默认移除请求路径的前缀"/api/"为资源路径
	ResourceFunc func(eudore.Context) string
	// 获取用户id的函数
	// 默认从请求Authorization header获取jwt Bearer数据解析用户信息。
	GetUserFunc func(eudore.Context) (int, error)
	// 权限拒绝时执行的函数
	// 默认返回403和相关权限信息
	ForbendFunc func(eudore.Context, string, string, string)
}

Policys 定义策略访问控制器。

func NewPolicys

func NewPolicys() *Policys

NewPolicys 函数创建默认策略访问控制器。

func (*Policys) AddMember

func (ctl *Policys) AddMember(member *Member)

AddMember 方法对指定userid和policyid进行授权。

Index越大匹配优先级越高,如果小于0则解除授权。

使用Expiration属性设置授权过期时间,Description属性仅记录描述。

func (*Policys) AddPolicy

func (ctl *Policys) AddPolicy(policy *Policy) error

AddPolicy 方法实现添加一个策略,如果策略stmt为空则删除策略。

func (*Policys) AddPolicyString

func (ctl *Policys) AddPolicyString(body string) error

AddPolicyString 方法添加一个策略字符串。

func (*Policys) GetMember

func (ctl *Policys) GetMember(userid int) []*Member

GetMember 方法获取指定userid绑定的Member。

func (*Policys) HandleHTTP

func (ctl *Policys) HandleHTTP(ctx eudore.Context)

HandleHTTP 方法实现eudore.handlerHTTP(handler.go#L49)接口, 作为请求处理中间件的处理函数,实现访问控制鉴权。

请求的param action为空回跳过鉴权方法。

func (*Policys) HandleRuntime

func (ctl *Policys) HandleRuntime(eudore.Context) any

HandleRuntime 方法返回Policys运行时数据。

func (*Policys) NewBearer

func (ctl *Policys) NewBearer(userid int, username, policy string, expires int64) string

NewBearer 默认的Bearer签名方法。

type SignatureUser

type SignatureUser struct {
	// 唯一必要的属性,指定请求的userid
	UserID   int    `alias:"user_id" json:"user_id" yaml:"user_id" protobuf:"name=user_id"`
	UserName string `alias:"user_name" json:"user_name" yaml:"user_name" protobuf:"name=user_name"`
	// 如果非空,则为base64([]Statement)
	Policy     string `json:"policy,omitempty" alias:"policy"`
	Expiration int64  `json:"expiration" alias:"expiration"`
}

SignatureUser 定义默认的用户信息,也可以组合该对象使用自定义签名对象。

type Signaturer

type Signaturer interface {
	Signed(any) string
	Parse(string, any) error
}

Signaturer 定义Policys进行用户信息签名的对象。

func NewSignaturerJwt

func NewSignaturerJwt(secret []byte) Signaturer

NewSignaturerJwt 函数创建一个Jwt Signaturer。

type Statement

type Statement struct {
	Effect      bool                         `json:"effect"`
	Action      []string                     `json:"action"`
	Resource    []string                     `json:"resource"`
	Description string                       `json:"description,omitempty" alias:"description"`
	Conditions  map[string]json.RawMessage   `json:"conditions,omitempty"`
	Data        map[string][]json.RawMessage `json:"data,omitempty"`
	// contains filtered or unexported fields
}

Statement 定义一条策略内容。

func (Statement) MatchAction

func (stmt Statement) MatchAction(action string) bool

MatchAction 方法匹配描述的条件。

func (Statement) MatchCondition

func (stmt Statement) MatchCondition(ctx eudore.Context) bool

MatchCondition 方法匹配描述的条件。

func (Statement) MatchData

func (stmt Statement) MatchData() map[string][]any

MatchData 方法返回匹配时的权限数据。

func (Statement) MatchResource

func (stmt Statement) MatchResource(resource string) bool

MatchResource 方法匹配描述的资源。

func (*Statement) UnmarshalJSON

func (stmt *Statement) UnmarshalJSON(body []byte) error

UnmarshalJSON 方法实现json反序列化。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL