Skip to content

鉴权问题 #3

@not5ound404

Description

@not5ound404

代码片段1:

// 这里为什么是验证前端传来的角色
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)

代码片段2:

// 到了这里中间件就会从票据里断言出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
}

1.通过上面的问题,似乎如果user1不具备超级管理员,如果在in.Role提交了Root参数,就拥有了Root权限。
2.能否提交一份完整的 config 文件。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions