在Go中实现的Web服务中,我希望能够根据用户的角色限制JSON响应中返回的字段.
例如,我可能有一个具有角色的当前登录用户和具有该角色的guest另一个用户admin
对于管理员,我希望json拥有所有密钥,例如
{
id: 1,
name: "John",
role: "admin"
}
Run Code Online (Sandbox Code Playgroud)
并且对于客人没有角色密钥,例如
{
id: 1,
name: "John"
}
Run Code Online (Sandbox Code Playgroud)
我现在可以编组json并返回所有字段.我需要能够限制它.
您可以查看@Volker建议并清除用户没有权限的结构字段.这可能是最容易实现的.
类似的第二个选项是创建自定义JSON编码器.仅在角色struct标记与当前用户的角色匹配时才对字段进行编码的方法.这是一些伪代码来说明:
type T struct {
currentRole Role `json:"-"`
FieldA string `json:"field_a,omitempty", role:"guest"`
FieldB string `json:"field_b,omitempty", role:"guest"`
FieldC int `json:"field_c,omitempty", role:"admin"`
}
// Have T implement the encoding/json.Marshaler interface.
func (t *T) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
// Use some reflection magic to iterate over struct fields.
for _, field := range getStructFields(t) {
// More reflection magic to extract field tag data.
role := getFieldTag(field, "role")
// If the field tag's role matches our current role,
// we are good to go. otherwise, skip this field.
if !matchingRole(role, t.currentRole) {
continue // skip this field
}
data, err := json.Marshal(fieldValue(field))
...
_, err = buf.Write(data)
...
}
return buf.Bytes(), nil
}
Run Code Online (Sandbox Code Playgroud)
如果您需要新的角色,这将是一个痛苦的维护.所以这不是我会轻易考虑做的事情.
我不完全确定您所寻找的是解决问题的正确方法.这取决于您使用代码的上下文,这在您的问题中并不明确.但是,如果这涉及一个网站,其中用户在网站上的能力仅由roleJSON字段的值定义,那么您正在考虑安全漏洞.他们可以直接进入浏览器调试器并更改此JSON对象的值以包含该"role: "admin"字段.并且presto!即时行政权力.在模板处理期间,服务器是否应该真正地处理是否基于用户角色呈现页面的某些部分.就像发布到服务器的任何和所有数据一样,应该再次检查和检查,以确保它来自可靠的来源.
如果这些都不适用于您,那么无论如何都要忽视这一段.
| 归档时间: |
|
| 查看次数: |
3247 次 |
| 最近记录: |