auth

package
v0.4.1 Latest Latest
Warning

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

Go to latest
Published: Jul 25, 2026 License: Apache-2.0 Imports: 29 Imported by: 0

Documentation

Overview

Package auth 提供 grpc-kit 微服务脚手架的认证授权模块

Package auth — GRN (Generic Resource Name) 实现

GRN 借鉴 AWS ARN 的 6 段固定结构:

grn:<partition>:<service>:<region>:<account-id>:<resource-type>/<resource-path>

完整规范见仓库内文档 adm/docs/spec/grn.md。本文件提供 Go 侧的解析 / 字符串化 / 通配匹配实现,与 Rego 端 `grn_match` 函数 MUST 行为一致;两侧共享同一份 table-driven 测试用例(pkg/auth/testdata/grn_match.json)。

设计要点:

  • 6 段强校验:scheme MUST 为 "grn";段数 MUST 等于 6,否则视为非法 GRN。
  • 第 6 段(resource)内部可能包含 ":"(备选形态 type:id),因此 Parse MUST 使用 SplitN(s, ":", 6) 而非 Split。
  • partition 段 MUST 严格相等:不接受 "*" / "" 通配(spec/grn.md R-PART-2)。
  • service / region / account 段 MAY 在 pattern 端为 "*"(或 ""=空 → 视为通配)。
  • resource 段含 "*" 时走 glob.match(pattern, ["/"], want) 语义。

Index

Constants

View Source
const (
	PartitionDefault = "grpc-kit"     // 默认分区
	PartitionCN      = "grpc-kit-cn"  // 中国大陆合规分区(预留)
	PartitionGov     = "grpc-kit-gov" // 政企专网分区(预留)
)

已登记的 GRN partition 枚举;新增 partition MUST 同步更新 adm/docs/spec/grn.md §6。

View Source
const DefaultPartition = "grpc-kit"

DefaultPartition 是 GRN partition 段在 Config.Partition 为空时使用的默认值。

Variables

View Source
var ErrInvalidGRN = errors.New("auth: invalid GRN")

ErrInvalidGRN 表示输入字符串不符合 GRN 6 段结构。

Functions

func Match added in v0.4.0

func Match(pattern, want string) bool

Match 判定 pattern 是否覆盖 want。语义与 Rego 端 `grn_match` 完全一致:

  • 两端 MUST 均为合法 6 段 GRN,scheme 严格为 "grn"。
  • partition 段 MUST 严格相等:pattern 端 "*" / "" 均**不接受**作为通配。
  • service / region / account:pattern 端 "*" 或空字符串视为通配;否则严格相等。
  • resource:pattern 含 "*" 时走 glob 匹配(分隔符 "/",与 OPA glob.match 一致), 不含 "*" 时严格相等。

want 端 MUST 是具体值(解析自请求上下文);在 want 端使用通配是调用方的逻辑错误, 本函数不为此做特殊处理(按字面量比较)。

func NormalizePartition added in v0.4.0

func NormalizePartition(p string) string

NormalizePartition 在 cfg 为空时返回默认 partition。

该函数供 input_builder / static_dict 在替换 ${partition} 占位符时使用, 确保 Config.Partition 未显式设置时仍能产生合法 GRN。

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 认证鉴权客户端

func NewClient

func NewClient(ctx context.Context, config *Config) (*Client, error)

NewClient 初始化实例

func (*Client) Allow

func (c *Client) Allow(ctx context.Context) (bool, error)

Allow 是否满足策略允许访问

func (*Client) AuthMetadata

func (c *Client) AuthMetadata(ctx context.Context, req *http.Request) context.Context

AuthMetadata 把 http 请求信息转换为 grpc 的 metadata 用于鉴权

func (*Client) Close

func (c *Client) Close(ctx context.Context)

Close 关闭释放资源

func (*Client) GetRBACData added in v0.3.8

func (c *Client) GetRBACData() *rbacv3.RBAC

func (*Client) WithLoggerOption

func (c *Client) WithLoggerOption(logger *logrus.Entry) *Client

WithLoggerOption 设置日志记录器

type Config

type Config struct {
	PackageName string
	Partition   string // GRN partition 段,默认 "grpc-kit"(详见 docs/spec/grn.md)
	OPASDK      *OPASDKConfig
	OPARego     *OPARegoConfig
	OPAEnvoy    *OPAEnvoyPluginConfig
}

Config xx

type GRN added in v0.4.0

type GRN struct {
	Partition string
	Service   string
	Region    string
	Account   string
	Resource  string
}

GRN 表示一个解析后的 GRN(6 段)。

字段顺序与 spec/grn.md §2 的段位顺序严格一致:

grn:<Partition>:<Service>:<Region>:<Account>:<Resource>

Resource 段保留完整字符串(含 type/path 或 type:id 形态),具体子结构由调用方解析。

func Parse added in v0.4.0

func Parse(s string) (*GRN, error)

Parse 解析一个 GRN 字符串;不合法时返回 ErrInvalidGRN 的包装错误。

注意:第 6 段可能包含 ":"(例如 `type:id` 形态),因此使用 SplitN 切分。

func (*GRN) String added in v0.4.0

func (g *GRN) String() string

String 将 GRN 序列化回字符串形态(6 段)。

type IDTokenClaims added in v0.4.0

type IDTokenClaims struct {
	jwt.RegisteredClaims
	Email         string `json:"email,omitempty"`
	EmailVerified bool   `json:"email_verified,omitempty"`
	// 注意:在这里 "Groups" 对应平台 "lion_roles" 表中的 "name" 而非 "lion_groups" 内容。
	Groups          []string          `json:"groups,omitempty"`
	FederatedClaims map[string]string `json:"federated_claims,omitempty"`
	Appid           string            `json:"appid,omitempty"`
	Tenant          string            `json:"tenant,omitempty"`
	Username        string            `json:"username,omitempty"`
	Nickname        string            `json:"nickname,omitempty"`
}

IDTokenClaims 用于框架jwt的数据结构 部分参考:https://openid.net/specs/openid-connect-core-1_0.html#IDToken

func ParseIDTokenClaims added in v0.4.0

func ParseIDTokenClaims(token string) (*IDTokenClaims, error)

ParseIDTokenClaims 解析 token

func (*IDTokenClaims) GetAccessToken added in v0.4.0

func (i *IDTokenClaims) GetAccessToken(signeKey string) (string, error)

GetAccessToken 获取或生成 jwt token

func (*IDTokenClaims) GetAccessTokenRSA added in v0.4.0

func (i *IDTokenClaims) GetAccessTokenRSA(signeKey *rsa.PrivateKey, kid string) (string, error)

func (*IDTokenClaims) GetMustUserID added in v0.4.0

func (i *IDTokenClaims) GetMustUserID() int64

func (*IDTokenClaims) SetEmail added in v0.4.0

func (i *IDTokenClaims) SetEmail(email string) *IDTokenClaims

func (*IDTokenClaims) SetExpiresAt added in v0.4.0

func (i *IDTokenClaims) SetExpiresAt(expiresIn int64) *IDTokenClaims

func (*IDTokenClaims) SetGroups added in v0.4.0

func (i *IDTokenClaims) SetGroups(groups []string) *IDTokenClaims

func (*IDTokenClaims) SetSubject added in v0.4.0

func (i *IDTokenClaims) SetSubject(subject string) *IDTokenClaims

type OPAEnvoyPluginConfig

type OPAEnvoyPluginConfig struct {
	GRPCAddress string
}

type OPARegoConfig

type OPARegoConfig struct {
	RegoBody []byte
	DataBody []byte
	// DataProviderFunc 动态数据提供函数,优先级高于 DataBody。
	// 若函数返回空或错误,则降级到 DataBody;DataBody 也为空时使用框架内置默认规则。
	DataProviderFunc func(ctx context.Context) ([]byte, error)
}

type OPASDKConfig

type OPASDKConfig struct {
	Config string
}

Jump to

Keyboard shortcuts

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