security

package
v0.0.0 Latest Latest
Warning

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

Go to latest
Published: Jul 19, 2026 License: MIT Imports: 19 Imported by: 0

README

security 包 — 安全认证与授权

所属层级: Infrastructure Layer
设计理念: 接口设计,灵活集成
设计灵感: Spring Security

概述

security 包提供全面的安全认证和授权功能,采用接口设计,方便快速集成。支持认证、授权、密码编码、过滤器链、Web 表达式等特性。

核心功能
功能 说明
认证 支持用户名密码、JWT、Basic 等多种认证方式
授权 基于角色和权限的访问控制
密码编码 BCrypt、SHA256 等多种密码编码器
过滤器链 可配置的安全过滤器链
Web 表达式 hasRole、hasAuthority 等表达式支持
用户管理 内存用户、DAO 用户详情服务
CORS 跨域资源共享支持
限流 请求速率限制

核心接口

Authentication 接口
type Authentication interface {
    GetPrincipal() any
    GetCredentials() any
    GetAuthorities() []string
    IsAuthenticated() bool
}
AuthenticationManager 接口
type AuthenticationManager interface {
    Authenticate(authentication Authentication) (Authentication, error)
}
UserDetailsService 接口
type UserDetailsService interface {
    LoadUserByUsername(username string) (UserDetails, error)
}
PasswordEncoder 接口
type PasswordEncoder interface {
    Encode(rawPassword string) string
    Matches(rawPassword, encodedPassword string) bool
}

快速开始

基本配置
package main

import (
    "net/http"
    "github.com/xudefa/enhance/security"
)

func main() {
    // 创建用户详情服务
    userDetailsService := security.NewInMemoryUserDetailsService()
    userDetailsService.CreateUser("admin", "hashed_password", []string{"ROLE_ADMIN", "ROLE_USER"})

    // 创建密码编码器
    passwordEncoder := security.NewBCryptPasswordEncoder()
    
    // 创建认证提供者和管理器
    authProvider := security.NewDaoAuthenticationProvider(userDetailsService, passwordEncoder)
    authManager := security.NewProviderManager(authProvider)

    // 配置 HTTP 安全
    sec := security.NewHttpSecurity()
    chain, err := sec.
        AuthenticationManager(authManager).
        UserDetailsService(userDetailsService).
        PasswordEncoder(passwordEncoder).
        Anonymous().
        AuthorizeRequests(func(reg security.AuthorizeRequests) {
            reg.AntMatchers("/public/**").PermitAll()
            reg.AntMatchers("/admin/**").HasRole("ADMIN")
            reg.AnyRequest().Authenticated()
        }).
        Build()
    if err != nil {
        panic(err)
    }

    // 集成 HTTP 服务器
    handler := security.NewSecurityFilterChainHandler(chain, yourAppHandler)
    http.ListenAndServe(":8080", handler)
}

认证授权执行流程

完整请求处理流程(从进入到出去)

当一个HTTP请求到达时,安全模块按以下流程处理:

HTTP请求 → SecurityFilterChainHandler → 过滤器链 → 业务Handler → HTTP响应
详细执行步骤

阶段1:请求进入(SecurityFilterChainHandler.ServeHTTP)

  1. SecurityFilterChainHandler.ServeHTTP(w, r) - 接收HTTP请求
  2. NewHttpRequestAdapter(r) - 将http.Request适配为SecurityRequest
  3. NewHttpResponseAdapter(w) - 将http.ResponseWriter适配为SecurityResponse
  4. securityFilterChain.DoFilter(ctx, request, response) - 开始执行过滤器链

阶段2:过滤器链执行(FilterChainProxy)

  1. FilterChainProxy.DoFilter() - 调用doFilterInternal(ctx, request, response, 0)
  2. 按索引顺序执行每个过滤器,每个过滤器通过chain.DoFilter()触发下一个

阶段3:各过滤器执行(按配置顺序)

  1. SecurityContextHolderFilter - 安全上下文处理

    • DoFilter() - 保存并清除全局认证信息
    • 执行后续过滤器链
    • 请求结束后恢复认证信息并清理
  2. AnonymousAuthenticationFilter - 匿名认证(如启用)

    • DoFilter() - 检查是否已认证
    • 未认证则创建AnonymousAuthenticationToken并设置到全局上下文
    • 继续执行后续过滤器链
  3. CORS过滤器 - 跨域处理(如启用)

    • CorsFilter.DoFilter() - 检查Origin头
    • 设置CORS响应头
    • 如果是OPTIONS预检请求,直接返回204
  4. 限流过滤器 - 请求限流(如启用)

    • RateLimitFilter.DoFilter() - 检查令牌桶
    • 超过限流则返回429
    • 否则继续执行后续过滤器链
  5. 认证过滤器 - 身份验证(根据配置选择)

    Basic认证

    • BasicAuthenticationFilter.DoFilter() - 检查Authorization头
    • 提取用户名密码,创建UsernamePasswordAuthenticationToken
    • 调用AuthenticationManager.Authenticate()进行认证
    • 认证成功后设置到全局安全上下文

    表单登录认证

    • UsernamePasswordAuthenticationFilter.DoFilter() - 检查POST请求和登录URL
    • 提取用户名密码,创建认证令牌
    • 调用AuthenticationManager.Authenticate()进行认证
    • 认证成功后重定向到成功URL

    JWT认证(jwt模块提供):

    • 从请求头提取JWT Token
    • 验证Token有效性
    • 认证成功后设置到全局安全上下文
  6. ExceptionTranslationFilter - 异常处理

    • DoFilter() - 执行后续过滤器链并捕获异常
    • 如果抛出ErrAccessDenied
      • 未认证用户:调用AuthenticationEntryPoint.Commence()返回401或重定向
      • 已认证用户:调用AccessDeniedHandler.Handle()返回403
  7. FilterSecurityInterceptor - 授权拦截

    • DoFilter() - 执行访问决策检查
    • SecurityMetadataSource.GetAttributes() - 获取URL对应的权限表达式
    • 如果已处理过该请求,直接放行
    • AccessDecisionManager.Decide() - 进行权限决策
    • 决策通过则继续,否则抛出ErrAccessDenied

阶段4:权限决策流程(AccessDecisionManager)

  1. AffirmativeBased.Decide() - 访问决策(默认使用肯定优先策略)
  2. 遍历所有投票者(Voter)进行投票:
    • WebExpressionVoter.Vote() - 解析Web表达式(permitAll、hasRole等)
    • AuthenticatedVoter.Vote() - 检查认证级别
    • RoleVoter.Vote() - 检查角色权限
  3. 根据投票结果决定是否允许访问

阶段5:请求处理完成

  1. 所有过滤器执行完毕,调用DefaultSecurityFilterChain.DoFilter()
  2. 返回到SecurityFilterChainHandler.ServeHTTP()
  3. 检查响应状态码,如果>=400则直接返回
  4. 从请求属性中获取认证信息:request.GetAttribute("security.currentAuthentication")
  5. 将认证信息注入request context:ContextWithAuthentication(r.Context(), auth)
  6. 调用业务Handler:nextHandler.ServeHTTP(w, r)

阶段6:业务处理

  1. 业务Handler从context获取认证信息:GetAuthenticationFromContext(ctx)
  2. 执行业务逻辑
  3. 返回HTTP响应
认证流程详解

Basic认证流程

请求携带Authorization: Basic base64(username:password)
  ↓
BasicAuthenticationFilter.DoFilter()
  ↓
提取用户名密码 → NewUsernamePasswordAuthenticationToken(username, password)
  ↓
AuthenticationManager.Authenticate(token)
  ↓
ProviderManager.Authenticate() → 遍历所有Provider
  ↓
DaoAuthenticationProvider.Authenticate()
  ↓
UserDetailsService.LoadUserByUsername() → 加载用户详情
  ↓
PasswordEncoder.Matches() → 验证密码
  ↓
检查用户状态(Enabled、AccountNonLocked等)
  ↓
认证成功 → NewAuthenticatedUsernamePasswordAuthenticationToken(user, authorities)
  ↓
SetAuthentication(authenticated) → 设置到全局安全上下文

表单登录认证流程

POST /login 携带username和password
  ↓
UsernamePasswordAuthenticationFilter.DoFilter()
  ↓
提取用户名密码 → NewUsernamePasswordAuthenticationToken(username, password)
  ↓
AuthenticationManager.Authenticate(token)
  ↓
(后续流程同Basic认证)
  ↓
认证成功 → 302重定向到defaultSuccessUrl
授权流程详解

URL权限检查流程

FilterSecurityInterceptor.DoFilter()
  ↓
SecurityMetadataSource.GetAttributes(request)
  ↓
根据URL匹配规则获取权限表达式
  例如:"/admin/**" → ["hasRole('ADMIN')"]
  ↓
AccessDecisionManager.Decide(auth, request, attributes)
  ↓
遍历所有Voter进行投票:
  - WebExpressionVoter: 解析"hasRole('ADMIN')"表达式
    ↓
    检查用户authorities是否包含"ROLE_ADMIN"
    ↓
    返回ACCESS_GRANTED或ACCESS_DENIED
  ↓
根据投票策略决定:
  - AffirmativeBased: 有一个GRANTED就通过
  - UnanimousBased: 所有都不DENIED才通过
  - ConsensusBased: 多数票决定
  ↓
通过 → 继续执行后续过滤器
拒绝 → 抛出ErrAccessDenied异常
过滤器执行顺序示例

默认过滤器链顺序(从上到下执行):

  1. SecurityContextHolderFilter - 安全上下文管理
  2. AnonymousAuthenticationFilter - 匿名认证
  3. CsrfFilter(如启用)- CSRF防护
  4. LogoutFilter(如配置)- 登出处理
  5. UsernamePasswordAuthenticationFilter(如启用)- 表单登录
  6. BasicAuthenticationFilter(如启用)- Basic认证
  7. ExceptionTranslationFilter - 异常转换
  8. FilterSecurityInterceptor - 授权拦截
  9. DefaultSecurityFilterChain - 默认链(放行到业务Handler)

API 参考

认证组件
组件 说明
Authentication 认证信息接口,包含 principal、credentials、authorities
AuthenticationManager 认证管理器,处理认证请求
AuthenticationProvider 认证提供者接口,定义认证逻辑
UsernamePasswordAuthenticationToken 用户名密码认证令牌
授权组件
组件 说明
AccessDecisionManager 访问决策管理器,决定资源访问权限
AccessDecisionVoter 访问决策投票者,投票决定访问权限
WebExpressionVoter Web 表达式投票者,支持 hasRole、hasAuthority 等
RoleVoter 角色投票者,检查角色权限
AuthenticatedVoter 认证投票者,检查认证级别
访问决策策略
策略 说明
AffirmativeBased 肯定优先,只要有投票者授予权限就通过
UnanimousBased 一致通过,所有投票者都不拒绝才通过
ConsensusBased 多数通过,多数投票者授予权限才通过
过滤器
过滤器 说明
FilterChainProxy 过滤器链代理
SecurityContextHolderFilter 安全上下文持有者过滤器
AnonymousAuthenticationFilter 匿名认证过滤器
ExceptionTranslationFilter 异常转换过滤器
FilterSecurityInterceptor 过滤器安全拦截器
BasicAuthenticationFilter Basic 认证过滤器
JwtAuthenticationFilter JWT 认证过滤器(jwt 模块提供)
过滤器执行顺序
  1. CORS 过滤器(如启用)
  2. 限流过滤器(如启用)
  3. JWT 认证过滤器(如启用 jwt 模块)
  4. SecurityContextHolder 过滤器
  5. Anonymous 认证过滤器
  6. ExceptionTranslation 过滤器
  7. FilterSecurityInterceptor
密码编码器
编码器 说明
NoOpPasswordEncoder 不编码,用于开发测试
BCryptPasswordEncoder SHA256 密码编码器
StandardPasswordEncoder 标准密码编码器,支持密钥加盐
DelegatingPasswordEncoder 委托密码编码器,支持多编码器
Web 表达式
表达式 说明
permitAll 允许所有人访问
denyAll 拒绝所有人访问
authenticated 仅允许已认证用户
hasRole('ROLE') 检查是否具有指定角色
hasAnyRole('ROLE1','ROLE2') 检查是否具有任一角色
hasAuthority('AUTHORITY') 检查是否具有指定权限
hasAnyAuthority('AUTH1','AUTH2') 检查是否具有任一权限
安全上下文
// 线程安全的认证信息存储
ctx := security.GetSecurityContext()
ctx.SetAuthentication(auth)
auth := ctx.Authentication()
ctx.ClearAuthentication()

// 全局认证快捷方法
security.SetAuthentication(auth)
security.GetAuthentication()
security.ClearAuthentication()

使用示例

URL 权限配置
security.AuthorizeRequests(func(reg security.AuthorizeRequests) {
    reg.AntMatchers("/public/**").PermitAll()
    reg.AntMatchers("/admin/**").HasRole("ADMIN")
    reg.AntMatchers("/user/**").HasAnyRole("ADMIN", "USER")
    reg.AntMatchers("/api/**").HasAuthority("ACCESS_API")
    reg.AnyRequest().Authenticated()
})
错误处理
// 错误类型
security.ErrAuthenticationFailed  // 认证失败
security.ErrAccessDenied          // 访问被拒绝
security.ErrUserNotFound          // 用户不存在
security.ErrBadCredentials        // 凭证错误
自动配置

通过 condition.OnProperty("security.enabled", "true") 控制,启用时自动配置以下组件:

# application.yaml
security:
  enabled: true
  cors:
    enabled: false
    allowed-origins: "*"
    allowed-methods: "GET,POST,PUT,DELETE,OPTIONS"
    allowed-headers: "Content-Type,Authorization,X-Requested-With"
    allow-credentials: false
    max-age: 3600
  rate-limit:
    enabled: false
    rate: 100          # 每秒请求数
    burst: 200         # 突发请求数
    exclude-paths: "/health,/actuator/health"
  rules: "/public/**->permitAll,/admin/**->hasRole('ADMIN'),/api/**->authenticated"
  login-url: "/login"
自动配置注册的 Bean
Bean ID 说明 是否可自定义
userDetailsService 用户详情服务
passwordEncoder 密码编码器(BCrypt)
authenticationManager 认证管理器
securityFilterChain 安全过滤器链
配置选项说明
配置项 说明 默认值
security.enabled 是否启用安全模块 false
security.cors.enabled 是否启用 CORS false
security.cors.allowed-origins 允许的源 *
security.cors.allowed-methods 允许的方法 GET,POST,PUT,DELETE,OPTIONS
security.cors.allowed-headers 允许的请求头 Content-Type,Authorization,X-Requested-With
security.cors.allow-credentials 是否允许凭证 false
security.cors.max-age 预检请求缓存时间(秒) 3600
security.rate-limit.enabled 是否启用限流 false
security.rate-limit.rate 限流速率(每秒) 100
security.rate-limit.burst 突发容量 200
security.rate-limit.exclude-paths 排除路径 /health,/actuator/health
security.rules URL 安全规则
security.login-url 登录页面 URL /login
与 JWT 模块集成

当同时启用安全模块和 JWT 模块时,JWT 认证过滤器会自动集成到安全过滤器链中:

# application.yaml
security:
  enabled: true
jwt:
  enabled: true
  secret-key: my-secret-key-123456
  exclude-paths: /login,/register

集成效果

  • JWT 过滤器会自动添加到安全过滤器链中
  • 支持配置排除路径(不需要 JWT 认证的路径)
  • 认证成功后,用户信息自动设置到安全上下文

最佳实践

1. 使用 BCrypt 密码编码器
// ✅ 推荐:使用 BCrypt 编码密码
passwordEncoder := security.NewBCryptPasswordEncoder()
hashedPassword := passwordEncoder.Encode("user_password")

// ⚠️ 不推荐:使用 NoOpPasswordEncoder(仅用于开发测试)
passwordEncoder := security.NewNoOpPasswordEncoder()
2. 合理配置 URL 权限
// ✅ 推荐:按最小权限原则配置 URL 权限
security.AuthorizeRequests(func(reg security.AuthorizeRequests) {
    reg.AntMatchers("/public/**", "/health").PermitAll()
    reg.AntMatchers("/admin/**").HasRole("ADMIN")
    reg.AntMatchers("/api/**").Authenticated()
    reg.AnyRequest().DenyAll()
})

// ⚠️ 不推荐:过度授权
security.AuthorizeRequests(func(reg security.AuthorizeRequests) {
    reg.AnyRequest().PermitAll()
})
3. 启用 CORS 和限流保护
// ✅ 推荐:生产环境启用 CORS 和限流
security:
  enabled: true
  cors:
    enabled: true
    allowed-origins: "https://yourdomain.com"
    allowed-methods: "GET,POST"
  rate-limit:
    enabled: true
    rate: 100
    burst: 200
4. 使用 JWT 认证
// ✅ 推荐:使用 JWT 进行无状态认证
jwt:
  enabled: true
  secret-key: my-secret-key-123456
  exclude-paths: /login,/register

// ⚠️ 不推荐:使用 Session 认证(有状态)
5. 自定义用户详情服务
// ✅ 推荐:实现自定义 UserDetailsService
type CustomUserDetailsService struct {
    db *sql.DB
}

func (s *CustomUserDetailsService) LoadUserByUsername(username string) (security.UserDetails, error) {
    // 从数据库加载用户
    return user, nil
}

// ⚠️ 不推荐:仅使用内存用户详情服务(生产环境)
userDetailsService := security.NewInMemoryUserDetailsService()

Documentation

Overview

Package security 提供安全功能支持,用于 enhance 框架。

Package security 提供安全功能支持,用于 enhance 框架。

该模块提供认证、授权、Web 安全过滤器、速率限制等安全机制,保护应用安全。 参考 Spring Security 的设计理念。

架构设计

  • SecurityContext: 安全上下文接口,管理认证信息
  • Authentication: 认证信息接口
  • AuthenticationManager: 认证管理器接口
  • AccessDecisionManager: 访问决策管理器接口
  • UserDetailsService: 用户详情服务接口
  • UserDetails: 用户详情接口
  • PasswordEncoder: 密码编码器接口
  • SecurityFilter: 安全过滤器接口
  • SecurityFilterChain: 安全过滤器链接口
  • AccessDeniedHandler: 访问拒绝处理器接口
  • AuthenticationEntryPoint: 认证入口点接口
  • SecurityMetadataSource: 安全元数据源接口
  • SecurityRequest: 安全请求接口
  • SecurityResponse: 安全响应接口
  • GrantedAuthority: 授予权限接口
  • HttpSecurity: HTTP 安全配置接口
  • AuthorizeRequests: 授权请求配置接口
  • ExpressionInterceptUrlRegistry: URL 拦截注册接口
  • SecurityConfig: 安全配置接口
  • LogoutSuccessHandler: 登出成功处理器接口
  • RateLimiter: 速率限制器接口
  • CsrfTokenManager: CSRF 令牌管理器接口

核心功能

  • 认证: 支持用户名/密码、JWT、OAuth2 等认证方式
  • 授权: 支持基于角色和权限的授权检查
  • 安全过滤器: 支持请求拦截和安全检查
  • 速率限制: 防止恶意请求和暴力破解
  • CSRF 防护: 防止跨站请求伪造攻击

使用方式

配置安全策略:

httpSec := security.NewHttpSecurity()
httpSec.FormLogin("/login").
    Logout("/logout").
    Csrf().
    AuthorizeRequests(func(authz security.AuthorizeRequests) {
        authz.AntMatchers("/api/**", "ROLE_API")
        authz.AnyAuthenticated()
    })

认证用户:

auth := security.Authenticate(username, password)
if auth != nil {
    // 认证成功
}

检查权限:

if security.HasPermission("user:read") {
    // 有权限访问
}

安全过滤器链

请求经过的过滤器链:

  • AuthenticationFilter: 认证过滤器
  • AuthorizationFilter: 授权过滤器
  • RateLimitFilter: 速率限制过滤器
  • CSRFTokenFilter: CSRF 防护过滤器

Package security 提供安全功能支持,用于 enhance 框架。

Package security 提供安全功能支持,用于 enhance 框架。

Package security 提供安全功能支持,用于 enhance 框架。 设计灵感来源于 Spring Security,采用接口设计模式,支持灵活的安全配置。

核心功能: - 认证(Authentication):验证用户身份 - 授权(Authorization):控制资源访问权限 - 安全上下文(SecurityContext):线程安全的认证信息存储 - 过滤器链(FilterChain):可配置的安全过滤器执行链

Index

Examples

Constants

View Source
const (
	ACCESS_GRANTED = 1  // 允许访问
	ACCESS_DENIED  = -1 // 拒绝访问
	ACCESS_ABSTAIN = 0  // 投票结果为 abstain 弃权
)

访问决策投票结果常量

View Source
const (
	// Casbin 配置
	CasbinEnabled          = "security.casbin.enabled"
	CasbinModelType        = "security.casbin.model-type"
	CasbinModelPath        = "security.casbin.model-path"
	CasbinModelText        = "security.casbin.model-text"
	CasbinPolicyType       = "security.casbin.policy-type"
	CasbinPolicyPath       = "security.casbin.policy-path"
	CasbinPolicyText       = "security.casbin.policy-text"
	CasbinAutoLoad         = "security.casbin.auto-load"
	CasbinAutoLoadInterval = "security.casbin.auto-load-interval"

	// casbin 字段常量
	CasbinLogFieldModel  = "model-path"
	CasbinLogFieldPolicy = "policy-path"
)
View Source
const (
	// Casbin 默认值
	DefaultCasbinModelType        = "file"
	DefaultCasbinModelPath        = "./config/casbin_model.conf"
	DefaultCasbinPolicyType       = "file"
	DefaultCasbinPolicyPath       = "./config/casbin_policy.csv"
	DefaultCasbinAutoLoad         = false
	DefaultCasbinAutoLoadInterval = 5
)
View Source
const (
	ConditionTrue = "true"
)
View Source
const (
	// Security 配置
	SecurityEnabled = "security.enabled"
)

Variables

View Source
var (
	// ErrAuthenticationFailed 认证失败。
	ErrAuthenticationFailed = errors.New("authentication failed")
	// ErrAccessDenied 访问被拒绝。
	ErrAccessDenied = errors.New("access denied")
	// ErrUserNotFound 用户未找到。
	ErrUserNotFound = errors.New("user not found")
	// ErrBadCredentials 凭证无效。
	ErrBadCredentials = errors.New("bad credentials")
)

错误定义。

Functions

func ClearAuthentication

func ClearAuthentication()

ClearAuthentication 清除当前全局安全上下文中的认证信息。

func ContextWithAuthentication

func ContextWithAuthentication(ctx context.Context, auth Authentication) context.Context

ContextWithAuthentication 将认证信息存入 context.Context。

func InitSecurityContext

func InitSecurityContext()

InitSecurityContext 初始化安全上下文。

用于测试环境重置安全状态。

func SetAuthentication

func SetAuthentication(auth Authentication)

SetAuthentication 设置当前认证信息到全局安全上下文。

func SetSecurityContext

func SetSecurityContext(ctx SecurityContext)

SetSecurityContext 设置全局安全上下文。

Types

type AccessDecisionManager

type AccessDecisionManager interface {
	// Decide 决定是否允许访问。
	Decide(ctx context.Context, authentication Authentication, object any, attributes []string) error
}

AccessDecisionManager 访问决策管理器接口。

决定是否允许访问受保护的资源。 基于认证主体的权限和资源的访问控制属性进行决策。

type AccessDecisionVoter

type AccessDecisionVoter interface {
	Vote(ctx context.Context, authentication Authentication, object any, attributes []string) int
}

AccessDecisionVoter 访问决策投票者接口。

投票决定是否授予访问权限。

type AccessDeniedHandler

type AccessDeniedHandler interface {
	// Handle 处理访问拒绝。
	Handle(ctx context.Context, request SecurityRequest, response SecurityResponse, err error) error
}

AccessDeniedHandler 访问拒绝处理器接口。

处理访问被拒绝的情况,如权限不足。 可以自定义响应格式或重定向到错误页面。

type AffirmativeBased

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

AffirmativeBased 肯定优先访问决策管理器 只要有一个投票者授予访问权限就允许访问(最宽松策略) 适用场景:多个权限满足其一即可访问

func NewAffirmativeBased

func NewAffirmativeBased(voters ...AccessDecisionVoter) *AffirmativeBased

NewAffirmativeBased 创建肯定优先决策管理器

func (*AffirmativeBased) AddVoter

func (m *AffirmativeBased) AddVoter(voter AccessDecisionVoter)

AddVoter 添加投票者

func (*AffirmativeBased) Decide

func (m *AffirmativeBased) Decide(ctx context.Context, authentication Authentication, object any, attributes []string) error

Decide 决定是否授予访问权限 策略: 只要有一个投票者授予权限就通过,有一个拒绝就拒绝

func (*AffirmativeBased) SetAllowIfAllAbstainDecisions

func (m *AffirmativeBased) SetAllowIfAllAbstainDecisions(allow bool)

SetAllowIfAllAbstainDecisions 设置是否在所有投票者都弃权时允许访问

type AnonymousAuthenticationFilter

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

AnonymousAuthenticationFilter 匿名认证过滤器 职责:如果当前请求未认证,则创建匿名认证令牌 使用场景:允许未登录用户访问公开资源

func NewAnonymousAuthenticationFilter

func NewAnonymousAuthenticationFilter() *AnonymousAuthenticationFilter

NewAnonymousAuthenticationFilter 创建匿名认证过滤器

func (*AnonymousAuthenticationFilter) DoFilter

DoFilter 如果当前没有认证则创建匿名认证

type AnonymousAuthenticationProvider

type AnonymousAuthenticationProvider struct{}

AnonymousAuthenticationProvider 匿名认证提供者 为匿名用户创建认证令牌,当其他认证提供者都无法处理时使用 使用场景:用户未登录但需要访问某些公开资源时

func NewAnonymousAuthenticationProvider

func NewAnonymousAuthenticationProvider() *AnonymousAuthenticationProvider

NewAnonymousAuthenticationProvider 创建匿名认证提供者

func (*AnonymousAuthenticationProvider) Authenticate

func (p *AnonymousAuthenticationProvider) Authenticate(ctx context.Context, authentication Authentication) (Authentication, error)

Authenticate 为匿名用户创建认证令牌 只有当传入的authentication为nil或未认证时,才创建匿名令牌

func (*AnonymousAuthenticationProvider) Supports

func (p *AnonymousAuthenticationProvider) Supports(authentication Authentication) bool

Supports 只支持UsernamePasswordAuthenticationToken类型

type AnonymousAuthenticationToken

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

AnonymousAuthenticationToken 匿名认证令牌

func NewAnonymousAuthenticationToken

func NewAnonymousAuthenticationToken(key string, principal any, authorities []string) *AnonymousAuthenticationToken

NewAnonymousAuthenticationToken 创建匿名认证令牌

func (*AnonymousAuthenticationToken) Authenticated

func (t *AnonymousAuthenticationToken) Authenticated() bool

Authenticated 返回是否已认证

func (*AnonymousAuthenticationToken) Authorities

func (t *AnonymousAuthenticationToken) Authorities() []string

Authorities 返回授权列表

func (*AnonymousAuthenticationToken) Credentials

func (t *AnonymousAuthenticationToken) Credentials() any

Credentials 返回凭证

func (*AnonymousAuthenticationToken) Name

Name 返回认证主体名称

func (*AnonymousAuthenticationToken) Principal

func (t *AnonymousAuthenticationToken) Principal() any

Principal 返回认证主体

type AuthenticatedVoter

type AuthenticatedVoter struct{}

AuthenticatedVoter 认证投票者 检查用户是否满足特定的认证级别 支持三种认证级别:FULLY(完全认证)、REMEMBERED(记住我)、ANONYMOUSLY(匿名)

func NewAuthenticatedVoter

func NewAuthenticatedVoter() *AuthenticatedVoter

func (*AuthenticatedVoter) Vote

func (v *AuthenticatedVoter) Vote(ctx context.Context, authentication Authentication, object any, attributes []string) int

Vote 投票决定访问权限 支持的表达式:

  • IS_AUTHENTICATED_FULLY: 要求完全认证(非匿名)
  • IS_AUTHENTICATED_REMEMBERED: 允许记住我或完全认证
  • IS_AUTHENTICATED_ANONYMOUSLY: 允许匿名用户访问(即所有人都可以访问)

type Authentication

type Authentication interface {
	// Principal 返回认证主体的标识,通常是用户名或用户对象。
	Principal() any
	// Credentials 返回凭证信息,如密码或令牌。
	Credentials() any
	// Authorities 返回授权列表,如角色和权限。
	Authorities() []string
	// Authenticated 是否已认证。
	Authenticated() bool
	// Name 返回认证主体的名称。
	Name() string
}

Authentication 认证信息接口。

代表一个已认证主体的完整信息,包括身份标识、凭证和权限。 实现应包含用户身份、角色列表和认证状态。

Example

ExampleAuthentication 使用示例:用户认证 展示完整的认证流程

userDetailsService := NewInMemoryUserDetailsService()
userDetailsService.CreateUser("admin", "admin123", []string{"ROLE_ADMIN", "ROLE_USER"})

passwordEncoder := NewNoOpPasswordEncoder()
authProvider := NewDaoAuthenticationProvider(userDetailsService, passwordEncoder, log.Build())
authManager := NewProviderManager(authProvider)

ctx := context.Background()

authToken := NewUsernamePasswordAuthenticationToken("admin", "admin123")
authenticated, err := authManager.Authenticate(ctx, authToken)
if err != nil {
	fmt.Printf("Authentication failed: %v\n", err)
	return
}

fmt.Printf("Authentication successful!\n")
fmt.Printf("Principal: %v\n", authenticated.Principal())
fmt.Printf("Authorities: %v\n", authenticated.Authorities())
fmt.Printf("Authenticated: %v\n", authenticated.Authenticated())
fmt.Printf("Name: %s\n", authenticated.Name())

func GetAuthentication

func GetAuthentication() Authentication

GetAuthentication 获取当前认证信息。

优先从请求上下文获取,如果不存在则从全局安全上下文获取。

func GetAuthenticationFromContext

func GetAuthenticationFromContext(ctx context.Context) Authentication

GetAuthenticationFromContext 从 context.Context 获取认证信息。

type AuthenticationEntryPoint

type AuthenticationEntryPoint interface {
	// Commence 开始认证流程。
	Commence(ctx context.Context, request SecurityRequest, response SecurityResponse, err error) error
}

AuthenticationEntryPoint 认证入口点接口。

处理未认证用户访问受保护资源的情况。 通常返回 401 状态码或重定向到登录页面。

type AuthenticationManager

type AuthenticationManager interface {
	// Authenticate 执行认证。
	Authenticate(ctx context.Context, authentication Authentication) (Authentication, error)
}

AuthenticationManager 认证管理器接口。

负责处理认证请求,验证用户凭证并返回认证信息。 通常与 UserDetailsService 配合使用。

type AuthenticationProvider

type AuthenticationProvider interface {
	Authenticate(ctx context.Context, authentication Authentication) (Authentication, error)
	Supports(authentication Authentication) bool
}

AuthenticationProvider 认证提供者接口。

定义认证逻辑。

type AuthorizeRequests

type AuthorizeRequests interface {
	// AntMatchers 配置 Ant 风格的路径匹配器。
	AntMatchers(patterns ...string) ExpressionInterceptUrlRegistry
	// AnyRequest 配置所有请求。
	AnyRequest() ExpressionInterceptUrlRegistry
}

AuthorizeRequests 授权请求配置接口。

配置 URL 路径的访问规则。

type BasicAuthenticationEntryPointWithRealm

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

BasicAuthenticationEntryPointWithRealm Basic认证入口点(带Realm)

func NewBasicAuthenticationEntryPointWithRealm

func NewBasicAuthenticationEntryPointWithRealm(realmName string, logger log.Logger) *BasicAuthenticationEntryPointWithRealm

NewBasicAuthenticationEntryPointWithRealm 创建带Realm的Basic认证入口点

func (*BasicAuthenticationEntryPointWithRealm) Commence

Commence 返回Basic认证失败响应

type BasicAuthenticationFilter

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

BasicAuthenticationFilter Basic认证过滤器 职责:从Authorization头中提取Basic认证信息并进行认证 认证流程: 1. 检查Authorization头是否存在且为Basic类型 2. 解码Base64获取用户名和密码 3. 调用AuthenticationManager进行认证 4. 认证成功后将认证信息设置到全局安全上下文和request context

func NewBasicAuthenticationFilter

func NewBasicAuthenticationFilter(authenticationManager AuthenticationManager) *BasicAuthenticationFilter

NewBasicAuthenticationFilter 创建Basic认证过滤器

func (*BasicAuthenticationFilter) DoFilter

DoFilter 处理Basic认证

type BasicAuthenticationFilterWithRealm

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

BasicAuthenticationFilterWithRealm 带Realm的Basic认证过滤器

func NewBasicAuthenticationFilterWithRealm

func NewBasicAuthenticationFilterWithRealm(authManager AuthenticationManager, realmName string, logger log.Logger) *BasicAuthenticationFilterWithRealm

NewBasicAuthenticationFilterWithRealm 创建带Realm的Basic认证过滤器

func (*BasicAuthenticationFilterWithRealm) DoFilter

DoFilter 处理Basic认证

type CasbinEnforcer

type CasbinEnforcer interface {
	// Enforce 检查请求是否允许。
	// 参数:subject - 主体(用户/角色),object - 资源,action - 操作
	// 返回:是否允许,错误
	Enforce(ctx context.Context, subject, object, action string) (bool, error)
	// AddPolicy 添加策略。
	// 参数:sub - 主体,obj - 资源,act - 操作
	// 返回:错误
	AddPolicy(ctx context.Context, sub, obj, act string) error
	// RemovePolicy 移除策略。
	// 参数:sub - 主体,obj - 资源,act - 操作
	// 返回:错误
	RemovePolicy(ctx context.Context, sub, obj, act string) error
	// GetPolicy 获取所有策略。
	// 返回:策略列表(二维数组),错误
	GetPolicy(ctx context.Context) ([][]string, error)
	// LoadPolicy 重新加载策略。
	// 返回:错误
	LoadPolicy(ctx context.Context) error
	// SavePolicy 保存策略。
	// 返回:错误
	SavePolicy(ctx context.Context) error
}

CasbinEnforcer Casbin 执行器接口。

封装 Casbin 的核心功能,提供权限检查。 实现类:DefaultCasbinEnforcer(starter/casbin)、GormCasbinEnforcer(starter/casbin-gorm)、XormCasbinEnforcer(starter/casbin-xorm)

type CasbinVoter

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

CasbinVoter Casbin 投票者实现。

实现 AccessDecisionVoter 接口,将 Casbin 的权限检查集成到 enhance 的访问决策机制中。

工作流程:

  1. 检查用户是否已认证(未认证则弃权)
  2. 从 Authentication 中提取用户名作为 subject
  3. 从 SecurityRequest 中提取 URI 和 HTTP 方法作为 object 和 action
  4. 调用 CasbinEnforcer.Enforce() 进行权限检查
  5. 返回投票结果(ACCESS_GRANTED / ACCESS_DENIED / ACCESS_ABSTAIN)

投票策略:

  • 未认证用户:ACCESS_ABSTAIN(弃权,让其他 Voter 决定)
  • Casbin 允许:ACCESS_GRANTED(授予访问)
  • Casbin 拒绝:ACCESS_DENIED(拒绝访问)
  • 发生错误:ACCESS_ABSTAIN(弃权,让其他 Voter 决定)

注意:CasbinVoter 的投票结果会被 AffirmativeBased 决策管理器使用, 只要有一个 Voter 返回 ACCESS_GRANTED 就允许访问。

func NewCasbinVoter

func NewCasbinVoter(enforcer CasbinEnforcer) *CasbinVoter

NewCasbinVoter 创建 Casbin 投票者。

func (*CasbinVoter) Supports

func (v *CasbinVoter) Supports(ctx context.Context, authentication Authentication, object any, attributes []string) bool

Supports 是否支持该属性。

func (*CasbinVoter) Vote

func (v *CasbinVoter) Vote(ctx context.Context, authentication Authentication, object any, attributes []string) int

Vote 投票决定是否授予访问权限。

type ConsensusBased

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

ConsensusBased 共识优先访问决策管理器 根据多数投票结果决定访问权限(民主策略) 适用场景:需要综合考虑多个权限维度

func NewConsensusBased

func NewConsensusBased(voters ...AccessDecisionVoter) *ConsensusBased

NewConsensusBased 创建共识优先决策管理器

func (*ConsensusBased) AddVoter

func (m *ConsensusBased) AddVoter(voter AccessDecisionVoter)

AddVoter 添加投票者

func (*ConsensusBased) Decide

func (m *ConsensusBased) Decide(ctx context.Context, authentication Authentication, object any, attributes []string) error

Decide 决定是否授予访问权限 策略: 根据多数票决定,相同数量时按配置处理

func (*ConsensusBased) SetAllowIfAllAbstainDecisions

func (m *ConsensusBased) SetAllowIfAllAbstainDecisions(allow bool)

SetAllowIfAllAbstainDecisions 设置是否在所有投票者都弃权时允许访问

func (*ConsensusBased) SetAllowIfEqualGrantedDenied

func (m *ConsensusBased) SetAllowIfEqualGrantedDenied(allow bool)

SetAllowIfEqualGrantedDenied 设置当授权和拒绝票数相同时的处理方式

type CookieClearingLogoutHandler

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

CookieClearingLogoutHandler Cookie清除登出处理器 职责:登出时清除指定的Cookie(如会话Cookie、CSRF Token等)

func NewCookieClearingLogoutHandler

func NewCookieClearingLogoutHandler(cookieNames ...string) *CookieClearingLogoutHandler

NewCookieClearingLogoutHandler 创建 Cookie 清除登出处理器。

func (*CookieClearingLogoutHandler) Logout

func (h *CookieClearingLogoutHandler) Logout(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)

Logout 清除指定 Cookie。

type CookieCsrfTokenRepository

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

CookieCsrfTokenRepository 基于Cookie的CSRF令牌仓库 职责:生成、保存和验证CSRF Token 存储策略:将Token保存到Cookie中,客户端需在请求头中携带Token

func NewCookieCsrfTokenRepository

func NewCookieCsrfTokenRepository() *CookieCsrfTokenRepository

NewCookieCsrfTokenRepository 创建基于 Cookie 的 CSRF 令牌仓库。

func (*CookieCsrfTokenRepository) ClearToken

func (r *CookieCsrfTokenRepository) ClearToken(ctx context.Context, request SecurityRequest, response SecurityResponse)

ClearToken 清除 CSRF 令牌。

func (*CookieCsrfTokenRepository) GenerateToken

func (r *CookieCsrfTokenRepository) GenerateToken(ctx context.Context, request SecurityRequest) (*CsrfToken, error)

GenerateToken 生成新的 CSRF 令牌。

func (*CookieCsrfTokenRepository) SaveToken

func (r *CookieCsrfTokenRepository) SaveToken(ctx context.Context, request SecurityRequest, response SecurityResponse, token *CsrfToken)

SaveToken 保存 CSRF 令牌到 Cookie。

func (*CookieCsrfTokenRepository) ValidateToken

func (r *CookieCsrfTokenRepository) ValidateToken(ctx context.Context, request SecurityRequest, token string) bool

ValidateToken 验证 CSRF 令牌。

type CorsConfig

type CorsConfig struct {
	AllowedOrigins   []string
	AllowedMethods   []string
	AllowedHeaders   []string
	ExposedHeaders   []string
	AllowCredentials bool
	MaxAge           int
	Log              log.Logger
}

CorsConfig CORS配置

type CorsFilter

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

CorsFilter CORS过滤器

func NewCorsFilter

func NewCorsFilter(config CorsConfig) *CorsFilter

NewCorsFilter 创建CORS过滤器

func (*CorsFilter) DoFilter

func (f *CorsFilter) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse, chain SecurityFilterChain) error

DoFilter 处理CORS请求

type CsrfAuthenticationStrategy

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

CsrfAuthenticationStrategy CSRF 令牌会话认证策略。

func NewCsrfAuthenticationStrategy

func NewCsrfAuthenticationStrategy() *CsrfAuthenticationStrategy

NewCsrfAuthenticationStrategy 创建 CSRF 认证策略。

func (*CsrfAuthenticationStrategy) OnAuthentication

func (s *CsrfAuthenticationStrategy) OnAuthentication(ctx context.Context, authentication Authentication, request SecurityRequest, response SecurityResponse)

OnAuthentication 认证成功后生成新的 CSRF 令牌。

type CsrfFilter

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

CsrfFilter CSRF防护过滤器 职责:防止跨站请求伪造攻击 执行流程: 1. GET/HEAD/OPTIONS/TRACE请求:生成并保存CSRF Token到Cookie 2. POST/PUT/DELETE等请求:验证请求头中的CSRF Token 3. Token验证失败则拒绝请求

func NewCsrfFilter

func NewCsrfFilter(tokenRepository CsrfTokenRepository) *CsrfFilter

NewCsrfFilter 创建 CSRF 过滤器。

func (*CsrfFilter) AddExcludePath

func (f *CsrfFilter) AddExcludePath(paths ...string) error

AddExcludePath 添加排除路径。

func (*CsrfFilter) DoFilter

func (f *CsrfFilter) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse, chain SecurityFilterChain) error

DoFilter 执行 CSRF 检查。

type CsrfToken

type CsrfToken struct {
	Identifier string // 令牌标识符
	Value      string // 令牌值
}

- CsrfToken: CSRF 令牌结构。

type CsrfTokenManager

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

CsrfTokenManager CSRF 令牌管理器。

func NewCsrfTokenManager

func NewCsrfTokenManager() *CsrfTokenManager

NewCsrfTokenManager 创建 CSRF 令牌管理器。

func (*CsrfTokenManager) GenerateToken

func (m *CsrfTokenManager) GenerateToken(principal string) string

GenerateToken 为用户生成 CSRF 令牌。

func (*CsrfTokenManager) RemoveToken

func (m *CsrfTokenManager) RemoveToken(principal string)

RemoveToken 移除用户的 CSRF 令牌。

func (*CsrfTokenManager) ValidateToken

func (m *CsrfTokenManager) ValidateToken(principal, token string) bool

ValidateToken 验证 CSRF 令牌。

type CsrfTokenRepository

type CsrfTokenRepository interface {
	// GenerateToken 生成新的 CSRF 令牌。
	GenerateToken(ctx context.Context, request SecurityRequest) (*CsrfToken, error)
	// ValidateToken 验证 CSRF 令牌。
	ValidateToken(ctx context.Context, request SecurityRequest, token string) bool
	// SaveToken 保存 CSRF 令牌到响应。
	SaveToken(ctx context.Context, request SecurityRequest, response SecurityResponse, token *CsrfToken)
	// ClearToken 清除 CSRF 令牌。
	ClearToken(ctx context.Context, request SecurityRequest, response SecurityResponse)
}

CsrfTokenRepository CSRF 令牌仓库接口。

管理 CSRF 令牌的生成、验证、保存和清除。

type DaoAuthenticationProvider

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

DaoAuthenticationProvider 基于DAO的认证提供者 从UserDetailsService加载用户并验证密码 认证流程: 1. 从认证令牌中提取用户名 2. 通过UserDetailsService加载用户详情 3. 验证密码是否匹配 4. 检查用户状态(是否启用、是否锁定等) 5. 认证成功后返回包含用户详情的认证令牌

func NewDaoAuthenticationProvider

func NewDaoAuthenticationProvider(userDetailsService UserDetailsService, passwordEncoder PasswordEncoder, logger log.Logger) *DaoAuthenticationProvider

NewDaoAuthenticationProvider 创建DAO认证提供者

func (*DaoAuthenticationProvider) Authenticate

func (p *DaoAuthenticationProvider) Authenticate(ctx context.Context, authentication Authentication) (Authentication, error)

Authenticate 执行认证逻辑 1. 根据用户名加载用户信息 2. 验证密码 3. 检查用户状态

func (*DaoAuthenticationProvider) Supports

func (p *DaoAuthenticationProvider) Supports(authentication Authentication) bool

Supports 判断是否支持该认证方式

type DefaultLogoutSuccessHandler

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

DefaultLogoutSuccessHandler 默认登出成功处理器 职责:登出成功后重定向到指定URL(默认/login?logout)

func NewDefaultLogoutSuccessHandler

func NewDefaultLogoutSuccessHandler(defaultTargetUrl string) *DefaultLogoutSuccessHandler

NewDefaultLogoutSuccessHandler 创建默认登出成功处理器。

func (*DefaultLogoutSuccessHandler) OnLogoutSuccess

func (h *DefaultLogoutSuccessHandler) OnLogoutSuccess(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)

OnLogoutSuccess 处理登出成功。

type DefaultSecurityFilterChain

type DefaultSecurityFilterChain struct{}

DefaultSecurityFilterChain 默认安全过滤器链 当所有过滤器都执行完毕后调用

func (*DefaultSecurityFilterChain) DoFilter

type DelegatingPasswordEncoder

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

DelegatingPasswordEncoder 委托密码编码器 职责:支持多种编码器,可根据编码ID选择合适的编码器 编码格式:{编码器ID}encodedPassword,例如:{bcrypt}$2a$10$... 优势:支持密码编码算法迁移,历史密码无需重新编码

func NewDelegatingPasswordEncoder

func NewDelegatingPasswordEncoder(idForEncode string, passwordEncoders map[string]PasswordEncoder) *DelegatingPasswordEncoder

NewDelegatingPasswordEncoder 创建委托密码编码器 idForEncode: 默认使用的编码器ID passwordEncoders: 可用的编码器映射

func (*DelegatingPasswordEncoder) Encode

func (e *DelegatingPasswordEncoder) Encode(rawPassword string) string

Encode 使用默认编码器编码密码

func (*DelegatingPasswordEncoder) Matches

func (e *DelegatingPasswordEncoder) Matches(rawPassword, encodedPassword string) bool

Matches 根据编码ID选择合适的编码器进行匹配

type EnhancedRateLimitFilter

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

EnhancedRateLimitFilter 增强版限流过滤器 职责:基于策略模式的限流过滤器,支持自定义限流策略和回调 与RateLimitFilter的区别:使用RateLimitStrategy接口,更灵活

func NewEnhancedRateLimitFilter

func NewEnhancedRateLimitFilter(strategy RateLimitStrategy, opts ...EnhancedRateLimitOption) *EnhancedRateLimitFilter

NewEnhancedRateLimitFilter 创建增强版限流过滤器。

func (*EnhancedRateLimitFilter) DoFilter

DoFilter 处理限流。

type EnhancedRateLimitOption

type EnhancedRateLimitOption func(*EnhancedRateLimitFilter)

EnhancedRateLimitOption 增强限流配置选项。

func WithExcludePaths

func WithExcludePaths(paths ...string) EnhancedRateLimitOption

WithExcludePaths 设置排除路径。

func WithOnRateLimit

func WithOnRateLimit(fn func(ctx context.Context, request SecurityRequest, response SecurityResponse)) EnhancedRateLimitOption

WithOnRateLimit 设置限流回调。

type ExceptionTranslationFilter

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

ExceptionTranslationFilter 异常转换过滤器 职责:捕获安全异常并转换为适当的HTTP响应 处理逻辑: - 未认证用户访问受保护资源:返回401或重定向到登录页 - 已认证用户访问无权限资源:返回403 Forbidden

func NewExceptionTranslationFilter

func NewExceptionTranslationFilter(accessDeniedHandler AccessDeniedHandler, authenticationEntryPoint AuthenticationEntryPoint) *ExceptionTranslationFilter

NewExceptionTranslationFilter 创建异常转换过滤器

func (*ExceptionTranslationFilter) DoFilter

DoFilter 捕获安全异常并转换为HTTP响应

type ExpressionBasedFilterInvocationSecurityMetadataSource

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

ExpressionBasedFilterInvocationSecurityMetadataSource 基于表达式的过滤器调用安全元数据源 职责:根据请求URL和HTTP方法,返回对应的安全属性(权限表达式) 支持Ant风格路径模式:/**, /path/*, /path/** 示例:"/admin/**" -> ["hasRole('ADMIN')"]

func NewExpressionBasedFilterInvocationSecurityMetadataSource

func NewExpressionBasedFilterInvocationSecurityMetadataSource() *ExpressionBasedFilterInvocationSecurityMetadataSource

NewExpressionBasedFilterInvocationSecurityMetadataSource 创建元数据源

func (*ExpressionBasedFilterInvocationSecurityMetadataSource) AddMapping

func (s *ExpressionBasedFilterInvocationSecurityMetadataSource) AddMapping(pattern string, attributes []string)

AddMapping 添加URL路径和安全属性映射 格式: "GET::/path" 或 "/path" (默认匹配所有HTTP方法) 示例: AddMapping("/admin/**", []string{"hasRole('ADMIN')"})

func (*ExpressionBasedFilterInvocationSecurityMetadataSource) GetAttributes

GetAttributes 获取请求对应的安全属性

type ExpressionInterceptUrlRegistry

type ExpressionInterceptUrlRegistry interface {
	// PermitAll 允许所有访问。
	PermitAll() HttpSecurity
	// Authenticated 需要认证。
	Authenticated() HttpSecurity
	// HasRole 需要指定角色。
	HasRole(role string) HttpSecurity
	// HasAnyRole 需要指定角色之一。
	HasAnyRole(roles ...string) HttpSecurity
	// HasAuthority 需要指定权限。
	HasAuthority(authority string) HttpSecurity
	// HasAnyAuthority 需要指定权限之一。
	HasAnyAuthority(authorities ...string) HttpSecurity
	// DenyAll 拒绝所有访问。
	DenyAll() HttpSecurity
}

ExpressionInterceptUrlRegistry URL 拦截注册接口。

配置特定 URL 的访问表达式。

type FilterChainProxy

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

FilterChainProxy 过滤器链代理 管理和执行多个安全过滤器,实现过滤器链式调用 执行流程:按顺序执行每个过滤器,最后调用目标处理器

func NewFilterChainProxy

func NewFilterChainProxy(filters []SecurityFilter, chain SecurityFilterChain) *FilterChainProxy

NewFilterChainProxy 创建过滤器链代理

func (*FilterChainProxy) DoFilter

func (p *FilterChainProxy) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse) error

DoFilter 执行过滤器链

type FilterSecurityInterceptor

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

FilterSecurityInterceptor 过滤器安全拦截器 职责:执行访问决策检查,决定是否允许请求继续 执行流程: 1. 从SecurityMetadataSource获取URL对应的安全属性(权限表达式) 2. 如果已处理过该请求(observeOncePerRequest),直接放行 3. 调用AccessDecisionManager进行权限决策 4. 决策通过则继续执行后续过滤器,否则抛出异常

func NewFilterSecurityInterceptor

func NewFilterSecurityInterceptor(securityMetadataSource SecurityMetadataSource, accessDecisionManager AccessDecisionManager, authenticationManager AuthenticationManager) *FilterSecurityInterceptor

NewFilterSecurityInterceptor 创建过滤器安全拦截器

func (*FilterSecurityInterceptor) DoFilter

DoFilter 执行访问决策

func (*FilterSecurityInterceptor) SetAccessDecisionManager

func (f *FilterSecurityInterceptor) SetAccessDecisionManager(manager AccessDecisionManager)

func (*FilterSecurityInterceptor) SetAuthenticationManager

func (f *FilterSecurityInterceptor) SetAuthenticationManager(manager AuthenticationManager)

func (*FilterSecurityInterceptor) SetSecurityMetadataSource

func (f *FilterSecurityInterceptor) SetSecurityMetadataSource(source SecurityMetadataSource)

type FixedWindowCounterRateLimiter

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

FixedWindowCounterRateLimiter 固定窗口计数器限流器 算法原理:将时间划分为固定窗口,每个窗口内计数请求数量 优点:实现简单,内存占用小 缺点:存在窗口临界问题(窗口切换时可能允许2倍流量) 适用场景:对限流精度要求不高的场景

func NewFixedWindowCounterRateLimiter

func NewFixedWindowCounterRateLimiter(windowSize time.Duration, maxRequests int) *FixedWindowCounterRateLimiter

NewFixedWindowCounterRateLimiter 创建固定窗口计数器限流器。

func (*FixedWindowCounterRateLimiter) Allow

Allow 判断是否允许请求。

func (*FixedWindowCounterRateLimiter) Cleanup

func (r *FixedWindowCounterRateLimiter) Cleanup()

Cleanup 清理过期计数器。

type GrantedAuthority

type GrantedAuthority interface {
	// Authority 返回权限字符串。
	Authority() string
}

GrantedAuthority 授予权限接口。

代表一个具体的权限,如 "ROLE_ADMIN"、"ROLE_USER"。

func NewAuthority

func NewAuthority(authority string) GrantedAuthority

NewAuthority 创建权限(GrantedAuthority接口)

type Http401UnauthorizedEntryPoint

type Http401UnauthorizedEntryPoint struct{}

Http401UnauthorizedEntryPoint 401未认证入口点

func NewHttp401UnauthorizedEntryPoint

func NewHttp401UnauthorizedEntryPoint() *Http401UnauthorizedEntryPoint

NewHttp401UnauthorizedEntryPoint 创建401入口点

func (*Http401UnauthorizedEntryPoint) Commence

func (e *Http401UnauthorizedEntryPoint) Commence(ctx context.Context, request SecurityRequest, response SecurityResponse, err error) error

Commence 返回401状态码

type Http403ForbiddenAccessDeniedHandler

type Http403ForbiddenAccessDeniedHandler struct{}

Http403ForbiddenAccessDeniedHandler 403禁止访问拒绝处理器

func NewHttp403ForbiddenAccessDeniedHandler

func NewHttp403ForbiddenAccessDeniedHandler() *Http403ForbiddenAccessDeniedHandler

NewHttp403ForbiddenAccessDeniedHandler 创建403拒绝处理器

func (*Http403ForbiddenAccessDeniedHandler) Handle

Handle 处理访问拒绝

type Http403ForbiddenEntryPoint

type Http403ForbiddenEntryPoint struct{}

Http403ForbiddenEntryPoint 403禁止访问入口点

func NewHttp403ForbiddenEntryPoint

func NewHttp403ForbiddenEntryPoint() *Http403ForbiddenEntryPoint

NewHttp403ForbiddenEntryPoint 创建403入口点

func (*Http403ForbiddenEntryPoint) Commence

func (e *Http403ForbiddenEntryPoint) Commence(ctx context.Context, request SecurityRequest, response SecurityResponse, err error) error

Commence 返回403状态码

type HttpRequestAdapter

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

HttpRequestAdapter HTTP请求适配器 职责:将标准库的http.Request适配为SecurityRequest接口 使安全模块能够透明地访问HTTP请求信息

func NewHttpRequestAdapter

func NewHttpRequestAdapter(request *http.Request) *HttpRequestAdapter

NewHttpRequestAdapter 创建HTTP请求适配器

func (*HttpRequestAdapter) GetAttribute

func (a *HttpRequestAdapter) GetAttribute(key string) (any, bool)

GetAttribute 获取请求属性

func (*HttpRequestAdapter) GetHeader

func (a *HttpRequestAdapter) GetHeader(key string) string

GetHeader 返回请求头

func (*HttpRequestAdapter) GetMethod

func (a *HttpRequestAdapter) GetMethod() string

GetMethod 返回HTTP方法

func (*HttpRequestAdapter) GetURI

func (a *HttpRequestAdapter) GetURI() string

GetURI 返回请求URI

func (*HttpRequestAdapter) SetAttribute

func (a *HttpRequestAdapter) SetAttribute(key string, value any)

SetAttribute 设置请求属性

type HttpResponseAdapter

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

HttpResponseAdapter HTTP响应适配器 职责:将标准库的http.ResponseWriter适配为SecurityResponse接口 使安全模块能够透明地写入HTTP响应

func NewHttpResponseAdapter

func NewHttpResponseAdapter(responseWriter http.ResponseWriter) *HttpResponseAdapter

NewHttpResponseAdapter 创建HTTP响应适配器

func (*HttpResponseAdapter) SetHeader

func (a *HttpResponseAdapter) SetHeader(key, value string)

SetHeader 设置响应头

func (*HttpResponseAdapter) SetStatusCode

func (a *HttpResponseAdapter) SetStatusCode(code int)

SetStatusCode 设置响应状态码

func (*HttpResponseAdapter) StatusCode

func (a *HttpResponseAdapter) StatusCode() int

StatusCode 返回当前响应状态码

func (*HttpResponseAdapter) Write

func (a *HttpResponseAdapter) Write(data []byte) error

Write 写入响应体

type HttpSecurity

type HttpSecurity interface {
	// AuthenticationManager 设置认证管理器。
	AuthenticationManager(authManager AuthenticationManager) HttpSecurity
	// UserDetailsService 设置用户详情服务。
	UserDetailsService(userDetailsService UserDetailsService) HttpSecurity
	// PasswordEncoder 设置密码编码器。
	PasswordEncoder(encoder PasswordEncoder) HttpSecurity
	// AccessDecisionManager 设置访问决策管理器。
	AccessDecisionManager(manager AccessDecisionManager) HttpSecurity
	// SecurityMetadataSource 设置安全元数据源。
	SecurityMetadataSource(source SecurityMetadataSource) HttpSecurity
	// AuthorizeRequests 配置授权规则。
	AuthorizeRequests(authorizer AuthorizeRequests) HttpSecurity
	// AddFilter 添加过滤器。
	AddFilter(filter SecurityFilter) HttpSecurity
	// AddFilterBefore 在指定过滤器之前添加过滤器。
	AddFilterBefore(filter SecurityFilter, beforeFilter SecurityFilter) HttpSecurity
	// AddFilterAfter 在指定过滤器之后添加过滤器。
	AddFilterAfter(filter SecurityFilter, afterFilter SecurityFilter) HttpSecurity
	// Anonymous 启用匿名访问。
	Anonymous() HttpSecurity
	// ExceptionHandling 配置异常处理。
	ExceptionHandling(handler AccessDeniedHandler, entryPoint AuthenticationEntryPoint) HttpSecurity
	// Csrf 启用 CSRF 防护。
	Csrf() HttpSecurity
	// Logout 配置登出。
	Logout(logoutUrl string, successHandler ...LogoutSuccessHandler) HttpSecurity
	// FormLogin 配置表单登录。
	FormLogin(loginProcessingUrl string, defaultSuccessUrl ...string) HttpSecurity
	// HttpBasic 启用 HTTP Basic 认证。
	HttpBasic() HttpSecurity
	// Build 构建安全过滤器链。
	Build() (SecurityFilterChain, error)
}

HttpSecurity HTTP 安全配置接口。

提供链式 API 配置 HTTP 安全规则。 支持认证管理器、用户详情服务、过滤器、CSRF、登出等配置。

使用示例:

httpSec := security.NewHttpSecurity()
httpSec.FormLogin("/login").
    Logout("/logout").
    Csrf().
    AuthorizeRequests(func(authz security.AuthorizeRequests) {
        authz.AntMatchers("/api/**", "ROLE_API")
        authz.AnyAuthenticated()
    })
Example

ExampleHttpSecurity 使用示例:HTTP安全配置 展示链式API配置HTTP安全规则

userDetailsService := NewInMemoryUserDetailsService()
userDetailsService.CreateUser("admin", "admin123", []string{"ROLE_ADMIN"})
userDetailsService.CreateUser("user", "user123", []string{"ROLE_USER"})

passwordEncoder := NewNoOpPasswordEncoder()
authProvider := NewDaoAuthenticationProvider(userDetailsService, passwordEncoder, log.Build())
authManager := NewProviderManager(authProvider)

metadataSource := NewExpressionBasedFilterInvocationSecurityMetadataSource()
metadataSource.AddMapping("/public/**", []string{"permitAll"})
metadataSource.AddMapping("/admin/**", []string{"hasRole('ADMIN')"})
metadataSource.AddMapping("/api/**", []string{"authenticated"})

httpSecurity := NewHttpSecurity()
httpSecurity.
	AuthenticationManager(authManager).
	SecurityMetadataSource(metadataSource)

chain, err := httpSecurity.Build()
if err != nil {
	fmt.Printf("Failed to build: %v\n", err)
	return
}

fmt.Printf("Security chain built successfully: %v\n", chain != nil)

func NewHttpSecurity

func NewHttpSecurity() HttpSecurity

NewHttpSecurity 创建新的HTTP安全配置

type InMemoryUserDetails

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

InMemoryUserDetails 内存用户详情实现 存储用户的完整认证和授权信息,包括: - 用户名和密码 - 权限列表(角色和权限) - 账户状态(是否启用、是否过期、是否锁定)

func NewInMemoryUserDetails

func NewInMemoryUserDetails(username, password string, authorities []string) *InMemoryUserDetails

NewInMemoryUserDetails 创建内存用户详情 默认值: enabled=true, accountNonExpired=true, credentialsNonExpired=true, accountNonLocked=true

func (*InMemoryUserDetails) AccountNonExpired

func (u *InMemoryUserDetails) AccountNonExpired() bool

AccountNonExpired 返回账户是否未过期

func (*InMemoryUserDetails) AccountNonLocked

func (u *InMemoryUserDetails) AccountNonLocked() bool

AccountNonLocked 返回账户是否未锁定

func (*InMemoryUserDetails) Authorities

func (u *InMemoryUserDetails) Authorities() []string

Authorities 返回授权列表

func (*InMemoryUserDetails) CredentialsNonExpired

func (u *InMemoryUserDetails) CredentialsNonExpired() bool

CredentialsNonExpired 返回凭证是否未过期

func (*InMemoryUserDetails) Enabled

func (u *InMemoryUserDetails) Enabled() bool

Enabled 返回是否启用

func (*InMemoryUserDetails) Password

func (u *InMemoryUserDetails) Password() string

Password 返回密码

func (*InMemoryUserDetails) Username

func (u *InMemoryUserDetails) Username() string

Username 返回用户名

type InMemoryUserDetailsService

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

InMemoryUserDetailsService 内存用户详情服务 使用内存map存储用户信息,线程安全 适用场景:开发和测试环境,生产环境应使用数据库实现

func NewInMemoryUserDetailsService

func NewInMemoryUserDetailsService() *InMemoryUserDetailsService

NewInMemoryUserDetailsService 创建内存用户详情服务

func (*InMemoryUserDetailsService) CreateUser

func (s *InMemoryUserDetailsService) CreateUser(username, password string, authorities []string)

CreateUser 创建新用户

func (*InMemoryUserDetailsService) DeleteUser

func (s *InMemoryUserDetailsService) DeleteUser(username string)

DeleteUser 删除用户

func (*InMemoryUserDetailsService) LoadUserByUsername

func (s *InMemoryUserDetailsService) LoadUserByUsername(ctx context.Context, username string) (UserDetails, error)

LoadUserByUsername 根据用户名加载用户 如果用户不存在返回ErrUserNotFound

func (*InMemoryUserDetailsService) UserCount

func (s *InMemoryUserDetailsService) UserCount() int

UserCount 返回用户总数

type LeakyBucketRateLimiter

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

LeakyBucketRateLimiter 漏桶限流器 算法原理:请求像水滴进入桶中,桶以固定速率漏水(处理请求) 优点:平滑处理请求,防止突发流量 适用场景:需要均匀处理请求的场景

func NewLeakyBucketRateLimiter

func NewLeakyBucketRateLimiter(capacity int, rate time.Duration) *LeakyBucketRateLimiter

NewLeakyBucketRateLimiter 创建漏桶限流器。

func (*LeakyBucketRateLimiter) Allow

func (r *LeakyBucketRateLimiter) Allow(key string) bool

Allow 判断是否允许请求。

func (*LeakyBucketRateLimiter) Cleanup

func (r *LeakyBucketRateLimiter) Cleanup()

Cleanup 清理空桶。

type LoginUrlAuthenticationEntryPoint

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

LoginUrlAuthenticationEntryPoint 登录URL认证入口点 未认证用户访问受保护资源时重定向到登录页

func NewLoginUrlAuthenticationEntryPoint

func NewLoginUrlAuthenticationEntryPoint(loginFormUrl string) *LoginUrlAuthenticationEntryPoint

NewLoginUrlAuthenticationEntryPoint 创建登录入口点

func (*LoginUrlAuthenticationEntryPoint) Commence

Commence 重定向到登录页

type LogoutFilter

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

LogoutFilter 登出过滤器 职责:处理登出请求,清除认证信息并执行登出处理器 执行流程: 1. 检查请求方法和URL是否匹配登出配置 2. 执行所有LogoutHandler(清除安全上下文、清除Cookie等) 3. 清除全局认证信息 4. 调用登出成功处理器(重定向或返回JSON)

func NewLogoutFilter

func NewLogoutFilter(logoutUrl string, handlers []LogoutHandler) *LogoutFilter

NewLogoutFilter 创建登出过滤器。

func (*LogoutFilter) AddLogoutHandler

func (f *LogoutFilter) AddLogoutHandler(handler LogoutHandler)

AddLogoutHandler 添加登出处理器。

func (*LogoutFilter) DoFilter

func (f *LogoutFilter) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse, chain SecurityFilterChain) error

DoFilter 处理登出请求。

func (*LogoutFilter) SetSuccessHandler

func (f *LogoutFilter) SetSuccessHandler(handler LogoutSuccessHandler)

SetSuccessHandler 设置登出成功处理器。

type LogoutHandler

type LogoutHandler interface {
	// Logout 处理登出。
	Logout(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)
}

LogoutHandler 登出处理器接口。

type LogoutSuccessHandler

type LogoutSuccessHandler interface {
	// OnLogoutSuccess 处理登出成功。
	OnLogoutSuccess(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)
}

LogoutSuccessHandler 登出成功处理器接口。

type NoOpPasswordEncoder

type NoOpPasswordEncoder struct{}

NoOpPasswordEncoder 不进行编码的密码编码器 适用场景:仅用于开发和测试环境,明文存储密码 警告:生产环境绝对不要使用此编码器

func NewNoOpPasswordEncoder

func NewNoOpPasswordEncoder() *NoOpPasswordEncoder

NewNoOpPasswordEncoder 创建NoOp密码编码器

func (*NoOpPasswordEncoder) Encode

func (e *NoOpPasswordEncoder) Encode(rawPassword string) string

Encode 直接返回原始密码

func (*NoOpPasswordEncoder) Matches

func (e *NoOpPasswordEncoder) Matches(rawPassword, encodedPassword string) bool

Matches 直接比较原始密码和编码后密码

type PasswordEncoder

type PasswordEncoder interface {
	// Encode 编码密码。
	Encode(rawPassword string) string
	// Matches 验证密码是否匹配。
	Matches(rawPassword, encodedPassword string) bool
}

PasswordEncoder 密码编码器接口。

用于密码的编码和验证。 推荐使用 bcrypt、argon2 等安全算法,避免使用 MD5、SHA1 等不安全算法。

Example

ExamplePasswordEncoder 使用示例:密码编码 展示不同密码编码器的使用

noop := NewNoOpPasswordEncoder()
encoded := noop.Encode("secret")
fmt.Printf("NoOp encoded: %s\n", encoded)
fmt.Printf("NoOp matches: %v\n", noop.Matches("secret", encoded))

sha256 := NewSha256PasswordEncoder()
encoded = sha256.Encode("secret")
fmt.Printf("SHA256 encoded: %s\n", encoded[:20]+"...")
fmt.Printf("SHA256 matches: %v\n", sha256.Matches("secret", encoded))

standard := NewStandardPasswordEncoder("mysecret")
encoded = standard.Encode("secret")
fmt.Printf("Standard encoded: %s\n", encoded[:20]+"...")
fmt.Printf("Standard matches: %v\n", standard.Matches("secret", encoded))

type ProviderManager

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

ProviderManager 认证提供者管理器 管理多个认证提供者,按顺序尝试认证 执行流程:遍历所有支持的提供者,返回第一个成功认证的结果

func NewProviderManager

func NewProviderManager(providers ...AuthenticationProvider) *ProviderManager

NewProviderManager 创建认证提供者管理器

func (*ProviderManager) AddProvider

func (m *ProviderManager) AddProvider(provider AuthenticationProvider)

AddProvider 添加认证提供者

func (*ProviderManager) Authenticate

func (m *ProviderManager) Authenticate(ctx context.Context, authentication Authentication) (Authentication, error)

Authenticate 尝试通过配置的提供者进行认证 遍历所有提供者,返回第一个成功认证的结果

type RateLimitConfig

type RateLimitConfig struct {
	Enabled      bool
	Rate         int
	Burst        int
	ExcludePaths []string
	Log          log.Logger
}

RateLimitConfig 限流配置

type RateLimitFilter

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

RateLimitFilter 限流过滤器

func NewRateLimitFilter

func NewRateLimitFilter(config RateLimitConfig) *RateLimitFilter

NewRateLimitFilter 创建限流过滤器

func (*RateLimitFilter) DoFilter

func (f *RateLimitFilter) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse, chain SecurityFilterChain) error

DoFilter 处理限流

type RateLimitStrategy

type RateLimitStrategy interface {
	// Allow 判断是否允许请求。
	Allow(key string) bool
}

RateLimitStrategy 限流策略接口。

type RateLimiter

type RateLimiter interface {
	// Allow 判断是否允许请求。
	Allow(key string) bool
	// Cleanup 清理过期数据。
	Cleanup()
}

RateLimiter 限流器接口。

提供请求频率限制功能,防止恶意请求和暴力攻击。

type Role

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

Role 角色实现 实现GrantedAuthority接口

func NewRole

func NewRole(authority string) *Role

NewRole 创建角色

func (*Role) Authority

func (r *Role) Authority() string

Authority 返回权限字符串

type RoleVoter

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

RoleVoter 角色投票者 只处理具有指定前缀(默认ROLE_)的角色 用于基于角色的访问控制(RBAC)

func NewRoleVoter

func NewRoleVoter() *RoleVoter

NewRoleVoter 创建角色投票者,默认前缀为ROLE_

func (*RoleVoter) SetRolePrefix

func (v *RoleVoter) SetRolePrefix(prefix string)

SetRolePrefix 设置角色前缀

func (*RoleVoter) Vote

func (v *RoleVoter) Vote(ctx context.Context, authentication Authentication, object any, attributes []string) int

Vote 投票决定访问权限 只处理rolePrefix前缀的属性,其他属性返回ABSTAIN

type SecurityAutoConfiguration

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

SecurityAutoConfiguration 安全模块自动配置 当 security.enabled=true 时自动装配以下组件: - UserDetailsService: 默认使用内存存储(可自定义) - PasswordEncoder: 默认使用NoOp编码器(生产环境应使用BCrypt) - AuthenticationManager: 包含DaoAuthenticationProvider和AnonymousAuthenticationProvider - SecurityFilterChain: 默认安全过滤器链(支持CORS、限流、JWT等)

自动配置流程: 1. 检查容器是否已有UserDetailsService,没有则创建默认的InMemoryUserDetailsService 2. 检查容器是否已有PasswordEncoder,没有则创建NoOpPasswordEncoder 3. 构建AuthenticationManager(包含DAO认证提供者和匿名认证提供者) 4. 构建SecurityFilterChain(包含CORS、限流、认证、授权等过滤器) 5. 将组件注册到容器中

func (*SecurityAutoConfiguration) Configure

Configure 执行自动配置

type SecurityBuilder

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

SecurityBuilder 安全配置构建器

func NewSecurityBuilder

func NewSecurityBuilder() *SecurityBuilder

NewSecurityBuilder 创建安全配置构建器

func (*SecurityBuilder) AccessDecisionManager

func (b *SecurityBuilder) AccessDecisionManager(manager AccessDecisionManager) *SecurityBuilder

AccessDecisionManager 设置访问决策管理器

func (*SecurityBuilder) AddFilter

func (b *SecurityBuilder) AddFilter(filter SecurityFilter) *SecurityBuilder

AddFilter 添加过滤器

func (*SecurityBuilder) AddFilterAfter

func (b *SecurityBuilder) AddFilterAfter(filter SecurityFilter, after SecurityFilter) *SecurityBuilder

AddFilterAfter 在指定过滤器后添加

func (*SecurityBuilder) AddFilterBefore

func (b *SecurityBuilder) AddFilterBefore(filter SecurityFilter, before SecurityFilter) *SecurityBuilder

AddFilterBefore 在指定过滤器前添加

func (*SecurityBuilder) AuthenticationManager

func (b *SecurityBuilder) AuthenticationManager(manager AuthenticationManager) *SecurityBuilder

AuthenticationManager 设置认证管理器

func (*SecurityBuilder) Build

func (b *SecurityBuilder) Build() SecurityConfig

Build 构建安全配置

func (*SecurityBuilder) EnableAnonymous

func (b *SecurityBuilder) EnableAnonymous() *SecurityBuilder

EnableAnonymous 启用匿名访问

func (*SecurityBuilder) EnableCsrf

func (b *SecurityBuilder) EnableCsrf() *SecurityBuilder

EnableCsrf 启用 CSRF 保护

func (*SecurityBuilder) EnableFormLogin

func (b *SecurityBuilder) EnableFormLogin(processingUrl string, defaultSuccessUrl ...string) *SecurityBuilder

EnableFormLogin 启用表单登录

func (*SecurityBuilder) EnableHttpBasic

func (b *SecurityBuilder) EnableHttpBasic() *SecurityBuilder

EnableHttpBasic 启用 HTTP Basic 认证

func (*SecurityBuilder) EnableLogout

func (b *SecurityBuilder) EnableLogout(url string, successHandler ...LogoutSuccessHandler) *SecurityBuilder

EnableLogout 启用登出

func (*SecurityBuilder) PasswordEncoder

func (b *SecurityBuilder) PasswordEncoder(encoder PasswordEncoder) *SecurityBuilder

PasswordEncoder 设置密码编码器

func (*SecurityBuilder) UserDetailsService

func (b *SecurityBuilder) UserDetailsService(service UserDetailsService) *SecurityBuilder

UserDetailsService 设置用户详情服务

type SecurityConfig

type SecurityConfig interface {
	// Configure 配置 HTTP 安全。
	Configure(http HttpSecurity) error
}

SecurityConfig 安全配置接口。

提供自定义安全配置的入口。

type SecurityContext

type SecurityContext interface {
	// Authentication 获取当前认证信息。
	Authentication() Authentication
	// SetAuthentication 设置认证信息。
	SetAuthentication(auth Authentication)
	// ClearAuthentication 清除认证信息。
	ClearAuthentication()
}

SecurityContext 安全上下文接口。

提供对当前认证信息的访问和管理。 通常与请求生命周期绑定,用于存储和检索认证主体信息。

使用示例:

ctx := security.NewSecurityContext()
ctx.SetAuthentication(auth)
auth := ctx.Authentication()

func GetSecurityContext

func GetSecurityContext() SecurityContext

GetSecurityContext 获取全局安全上下文。

func NewSecurityContext

func NewSecurityContext() SecurityContext

NewSecurityContext 创建新的安全上下文。

type SecurityContextHolderFilter

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

SecurityContextHolderFilter 安全上下文持有者过滤器 职责: 1. 请求开始前:保存当前全局认证信息并清除,防止请求间污染 2. 请求执行中:允许其他过滤器设置认证信息到全局上下文 3. 请求结束后:恢复之前的认证信息并清理当前请求的认证 注意:当前请求的认证信息会保存到请求属性中,供SecurityFilterChainHandler传递给业务handler

func NewSecurityContextHolderFilter

func NewSecurityContextHolderFilter(securityContext SecurityContext) *SecurityContextHolderFilter

NewSecurityContextHolderFilter 创建安全上下文持有者过滤器

func (*SecurityContextHolderFilter) DoFilter

DoFilter 执行过滤器链 在请求前保存全局认证信息并清除,请求结束后恢复之前的认证信息 当前请求的认证信息保存到请求属性中,供 SecurityFilterChainHandler 传递给 handler

type SecurityContextLogoutHandler

type SecurityContextLogoutHandler struct{}

SecurityContextLogoutHandler 安全上下文登出处理器 职责:登出时清除全局认证信息

func NewSecurityContextLogoutHandler

func NewSecurityContextLogoutHandler() *SecurityContextLogoutHandler

NewSecurityContextLogoutHandler 创建安全上下文登出处理器。

func (*SecurityContextLogoutHandler) Logout

func (h *SecurityContextLogoutHandler) Logout(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)

Logout 清除安全上下文。

type SecurityFilter

type SecurityFilter interface {
	// DoFilter 执行过滤器。
	DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse, chain SecurityFilterChain) error
}

SecurityFilter 安全过滤器接口。

处理安全相关的请求过滤,如认证、授权、CSRF 防护等。 过滤器按顺序执行,形成安全过滤器链。

type SecurityFilterChain

type SecurityFilterChain interface {
	// DoFilter 执行过滤器链。
	DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse) error
}

SecurityFilterChain 安全过滤器链接口。

按顺序执行多个安全过滤器。 每个过滤器可以决定是否继续执行下一个过滤器。

type SecurityFilterChainHandler

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

SecurityFilterChainHandler 安全过滤器链处理器 职责:将SecurityFilterChain适配为标准库的http.Handler 执行流程: 1. 接收HTTP请求,适配为SecurityRequest和SecurityResponse 2. 执行安全过滤器链(认证、授权等) 3. 如果过滤器链执行成功且状态码正常,将认证信息注入request context 4. 调用下一个handler(业务处理器)

func NewSecurityFilterChainHandler

func NewSecurityFilterChainHandler(securityFilterChain SecurityFilterChain, nextHandler http.Handler) *SecurityFilterChainHandler

NewSecurityFilterChainHandler 创建安全过滤器链处理器

func (*SecurityFilterChainHandler) ServeHTTP

ServeHTTP 实现http.Handler接口

func (*SecurityFilterChainHandler) SetNextHandler

func (h *SecurityFilterChainHandler) SetNextHandler(handler http.Handler)

SetNextHandler 设置下一个处理器

type SecurityMetadataSource

type SecurityMetadataSource interface {
	// GetAttributes 获取安全属性。
	GetAttributes(ctx context.Context, request SecurityRequest) ([]string, error)
}

SecurityMetadataSource 安全元数据源接口。

提供访问资源所需的安全属性(如角色要求)。 用于动态访问控制决策。

type SecurityRequest

type SecurityRequest interface {
	// GetMethod 获取请求方法。
	GetMethod() string
	// GetURI 获取请求 URI。
	GetURI() string
	// GetHeader 获取请求头。
	GetHeader(key string) string
	// SetAttribute 设置请求属性。
	SetAttribute(key string, value any)
	// GetAttribute 获取请求属性。
	GetAttribute(key string) (any, bool)
}

SecurityRequest 安全请求接口。

抽象 HTTP 请求,提供安全相关的访问方法。 用于获取请求方法、URI、头部等信息。

type SecurityResponse

type SecurityResponse interface {
	// SetStatusCode 设置状态码。
	SetStatusCode(code int)
	// SetHeader 设置响应头。
	SetHeader(key, value string)
	// Write 写入响应数据。
	Write(data []byte) error
}

SecurityResponse 安全响应接口。

抽象 HTTP 响应,提供安全相关的修改方法。 用于设置状态码、头部和响应体。

type Sha256PasswordEncoder

type Sha256PasswordEncoder struct{}

Sha256PasswordEncoder 基于 SHA256 的密码编码器

注意: 此实现仅适用于兼容性场景,不推荐用于生产环境。 生产环境应使用 BCryptPasswordEncoder 或 Argon2PasswordEncoder。

func NewSha256PasswordEncoder

func NewSha256PasswordEncoder() *Sha256PasswordEncoder

NewSha256PasswordEncoder 创建 SHA256 密码编码器

func (*Sha256PasswordEncoder) Encode

func (e *Sha256PasswordEncoder) Encode(rawPassword string) string

Encode 使用 SHA256 算法编码密码

func (*Sha256PasswordEncoder) Matches

func (e *Sha256PasswordEncoder) Matches(rawPassword, encodedPassword string) bool

Matches 比较编码后的密码

type SimpleLogoutSuccessHandler

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

SimpleLogoutSuccessHandler 简单登出成功处理器。

func NewSimpleLogoutSuccessHandler

func NewSimpleLogoutSuccessHandler(targetUrl string) *SimpleLogoutSuccessHandler

NewSimpleLogoutSuccessHandler 创建简单登出成功处理器。

func (*SimpleLogoutSuccessHandler) OnLogoutSuccess

func (h *SimpleLogoutSuccessHandler) OnLogoutSuccess(ctx context.Context, request SecurityRequest, response SecurityResponse, authentication Authentication)

OnLogoutSuccess 处理登出成功,重定向到指定 URL。

type SlidingWindowRateLimiter

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

SlidingWindowRateLimiter 滑动窗口限流器 算法原理:记录每个请求的时间戳,只统计窗口时间范围内的请求数量 优点:避免固定窗口的临界问题,限流更平滑 适用场景:需要精确控制请求频率的场景

func NewSlidingWindowRateLimiter

func NewSlidingWindowRateLimiter(windowSize time.Duration, maxRequests int) *SlidingWindowRateLimiter

NewSlidingWindowRateLimiter 创建滑动窗口限流器。

func (*SlidingWindowRateLimiter) Allow

func (r *SlidingWindowRateLimiter) Allow(key string) bool

Allow 判断是否允许请求。

func (*SlidingWindowRateLimiter) Cleanup

func (r *SlidingWindowRateLimiter) Cleanup()

Cleanup 清理过期窗口。

type StandardPasswordEncoder

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

StandardPasswordEncoder 标准密码编码器 使用密钥对密码进行SHA256哈希

func NewStandardPasswordEncoder

func NewStandardPasswordEncoder(secret string) *StandardPasswordEncoder

NewStandardPasswordEncoder 创建标准密码编码器 secret: 用于加盐的密钥

func (*StandardPasswordEncoder) Encode

func (e *StandardPasswordEncoder) Encode(rawPassword string) string

Encode 使用密钥对密码进行编码

func (*StandardPasswordEncoder) Matches

func (e *StandardPasswordEncoder) Matches(rawPassword, encodedPassword string) bool

Matches 比较编码后的密码

type StrategyRateLimiterAdapter

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

StrategyRateLimiterAdapter 限流器适配器。

func NewStrategyRateLimiterAdapter

func NewStrategyRateLimiterAdapter(limiter RateLimiter) *StrategyRateLimiterAdapter

NewStrategyRateLimiterAdapter 创建适配器。

func (*StrategyRateLimiterAdapter) Allow

func (a *StrategyRateLimiterAdapter) Allow(key string) bool

Allow 判断是否允许请求。

type TokenBucket

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

TokenBucket 令牌桶

func NewTokenBucket

func NewTokenBucket(capacity, rate int) *TokenBucket

NewTokenBucket 创建令牌桶

func (*TokenBucket) Take

func (b *TokenBucket) Take() bool

Take 尝试获取令牌

type UnanimousBased

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

UnanimousBased 一致通过访问决策管理器 只有所有投票者都不拒绝才允许访问(最严格策略) 适用场景:需要满足所有权限要求才能访问

func NewUnanimousBased

func NewUnanimousBased(voters ...AccessDecisionVoter) *UnanimousBased

NewUnanimousBased 创建一致通过决策管理器

func (*UnanimousBased) AddVoter

func (m *UnanimousBased) AddVoter(voter AccessDecisionVoter)

AddVoter 添加投票者

func (*UnanimousBased) Decide

func (m *UnanimousBased) Decide(ctx context.Context, authentication Authentication, object any, attributes []string) error

Decide 决定是否授予访问权限 策略: 所有投票者都不拒绝,且至少有一个授予权限时通过

func (*UnanimousBased) SetAllowIfAllAbstainDecisions

func (m *UnanimousBased) SetAllowIfAllAbstainDecisions(allow bool)

SetAllowIfAllAbstainDecisions 设置是否在所有投票者都弃权时允许访问

type UserDetails

type UserDetails interface {
	// Username 返回用户名。
	Username() string
	// Password 返回密码。
	Password() string
	// Authorities 返回权限列表。
	Authorities() []string
	// Enabled 账户是否启用。
	Enabled() bool
	// AccountNonExpired 账户是否未过期。
	AccountNonExpired() bool
	// CredentialsNonExpired 凭证是否未过期。
	CredentialsNonExpired() bool
	// AccountNonLocked 账户是否未锁定。
	AccountNonLocked() bool
}

UserDetails 用户详情接口。

包含用户的完整认证和授权信息。 实现应提供用户名、密码、权限列表和账户状态。

type UserDetailsService

type UserDetailsService interface {
	// LoadUserByUsername 根据用户名加载用户详情。
	LoadUserByUsername(ctx context.Context, username string) (UserDetails, error)
}

UserDetailsService 用户详情服务接口。

根据用户名加载用户信息,用于认证和授权。 实现可以从数据库、LDAP、内存等来源加载用户。

Example

ExampleUserDetailsService 使用示例:用户详情服务 展示如何创建和管理用户

service := NewInMemoryUserDetailsService()

service.CreateUser("john", "password123", []string{"ROLE_USER"})
service.CreateUser("jane", "password456", []string{"ROLE_USER", "ROLE_ADMIN"})

ctx := context.Background()

john, _ := service.LoadUserByUsername(ctx, "john")
fmt.Printf("Username: %s\n", john.Username())
fmt.Printf("Authorities: %v\n", john.Authorities())

fmt.Printf("Total users: %d\n", service.UserCount())

service.DeleteUser("john")
fmt.Printf("Users after delete: %d\n", service.UserCount())

type UsernamePasswordAuthenticationFilter

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

UsernamePasswordAuthenticationFilter 用户名密码认证过滤器

func NewUsernamePasswordAuthenticationFilterWithDefaults

func NewUsernamePasswordAuthenticationFilterWithDefaults(
	loginProcessingURL,
	defaultSuccessURL,
	failureURL string,
	authManager AuthenticationManager,
	logger log.Logger,
) *UsernamePasswordAuthenticationFilter

NewUsernamePasswordAuthenticationFilterWithDefaults 创建带默认值的用户名密码认证过滤器

func (*UsernamePasswordAuthenticationFilter) DoFilter

DoFilter 处理用户名密码认证

type UsernamePasswordAuthenticationToken

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

UsernamePasswordAuthenticationToken 用户名密码认证令牌 用于在认证过程中传递和存储用户凭证 认证前:包含用户名和密码(authenticated=false) 认证后:包含用户详情和权限列表(authenticated=true)

func NewAuthenticatedUsernamePasswordAuthenticationToken

func NewAuthenticatedUsernamePasswordAuthenticationToken(principal any, authorities []string) *UsernamePasswordAuthenticationToken

NewAuthenticatedUsernamePasswordAuthenticationToken 创建已认证的用户名密码令牌 用于认证成功后的令牌

func NewUsernamePasswordAuthenticationToken

func NewUsernamePasswordAuthenticationToken(principal, credentials any) *UsernamePasswordAuthenticationToken

NewUsernamePasswordAuthenticationToken 创建未认证的用户名密码令牌 用于认证请求的初始阶段

func (*UsernamePasswordAuthenticationToken) Authenticated

func (t *UsernamePasswordAuthenticationToken) Authenticated() bool

func (*UsernamePasswordAuthenticationToken) Authorities

func (t *UsernamePasswordAuthenticationToken) Authorities() []string

func (*UsernamePasswordAuthenticationToken) Credentials

func (t *UsernamePasswordAuthenticationToken) Credentials() any

func (*UsernamePasswordAuthenticationToken) Name

Name 返回认证主体名称 支持字符串和UserDetails两种principal类型

func (*UsernamePasswordAuthenticationToken) Principal

func (*UsernamePasswordAuthenticationToken) SetAuthenticated

func (t *UsernamePasswordAuthenticationToken) SetAuthenticated(authenticated bool)

SetAuthenticated 设置认证状态

func (*UsernamePasswordAuthenticationToken) SetAuthorities

func (t *UsernamePasswordAuthenticationToken) SetAuthorities(authorities []string)

SetAuthorities 设置授权列表

type VirtualFilterChain

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

VirtualFilterChain 虚拟过滤器链 在过滤器执行过程中跟踪当前索引,实现链式调用 每个过滤器执行完毕后,通过VirtualFilterChain触发下一个过滤器

func (*VirtualFilterChain) DoFilter

func (c *VirtualFilterChain) DoFilter(ctx context.Context, request SecurityRequest, response SecurityResponse) error

DoFilter 执行下一个过滤器

type WebExpressionVoter

type WebExpressionVoter struct{}

WebExpressionVoter Web表达式投票者 支持Spring Security风格的Web表达式语言 用于解析和执行权限表达式(如hasRole、hasAuthority等)

func NewWebExpressionVoter

func NewWebExpressionVoter() *WebExpressionVoter

func (*WebExpressionVoter) Vote

func (v *WebExpressionVoter) Vote(ctx context.Context, authentication Authentication, object any, attributes []string) int

Vote 投票决定访问权限 支持的表达式:

  • permitAll: 允许所有人访问
  • denyAll: 拒绝所有人访问
  • authenticated: 仅允许已认证用户
  • hasRole('ROLE'): 检查是否具有指定角色
  • hasAnyRole('ROLE1','ROLE2'): 检查是否具有任一指定角色
  • hasAuthority('AUTHORITY'): 检查是否具有指定权限
  • hasAnyAuthority('AUTH1','AUTH2'): 检查是否具有任一指定权限

type WebSecurity

type WebSecurity struct{}

WebSecurity Web安全配置入口 提供创建HTTP安全配置的工厂方法

func NewWebSecurity

func NewWebSecurity() *WebSecurity

NewWebSecurity 创建Web安全配置入口

func (*WebSecurity) Build

func (w *WebSecurity) Build() (SecurityFilterChain, error)

Build 构建安全过滤器链(已废弃,请使用HttpSecurity().Build())

func (*WebSecurity) HttpSecurity

func (w *WebSecurity) HttpSecurity() *httpSecurity

HttpSecurity 创建HTTP安全配置

Jump to

Keyboard shortcuts

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