// 这里为什么是验证前端传来的角色
if len(in.Role) > 0 {
if role, err = dao.AuthRole.GetByName(ctx, in.Role); err != nil {
return nil, err
}
} else {
if role, err = service.Auth().GetDefaultRole(ctx); err != nil {
return nil, err
}
}
if role == nil {
return nil, gerror.NewCode(biz.AuthRoleNotExists)
}
// 如果 user1 不是超级管理员,通过前端传来Root角色,那么这条判断就不会执行
var isExist = true
if user.Id != consts.RootAdminId && role.Id != consts.RootRoleId && role.Id != consts.DefaultRoleId {
if isExist, err = dao.AuthAccess.IsExist(ctx, &do.AuthAccess{
UserId: user.Id,
RoleId: role.Id,
}); err != nil {
return nil, err
}
}
if !isExist {
return nil, gerror.NewCode(biz.AuthNotPermission)
}
// 到了这里就会成为 user1 签发了 Root 权限
return s.SigninDrect(ctx, user, role)
// 到了这里中间件就会从票据里断言出Root角色
if code == biz.CodeOk {
if claims, err = service.Auth().VerifyToken(ctx, tokenTicket); err == nil {
// 从签名中获取用户角色
role = claims["isr"].(string)
uuid = claims["sub"].(string)
} else {
code = gerror.Code(err)
}
}
// 中间件虽然提交了"Subject: uuid"
if code == biz.CodeOk {
if err = service.Auth().Verify(ctx, &model.AuthVerifyInput{
Subject: uuid,
Path: r.URL.Path,
Method: r.Method,
Role: role,
}); err == nil {
// 设置上下文用户
biz.Ctx().SetUser(r.Context(), &biz.ContextUser{
Uuid: uuid,
Role: role,
})
} else {
code = gerror.Code(err)
}
}
// 但是到了casbin这里并没有验证Subject
func Verify(p *VerifyPayload) (bool, error) {
var (
ok bool
err error
)
// 验证角色权限
if ok, err = enforcer.Enforce(ROLE_NAME_PERFIX+p.Role, p.Path, p.Method); err != nil {
return false, err
}
return ok, nil
}