gin web框架中根据权限显示不同页面内容
背景
基于golang web框架gin开发的个人博客系统(wblog)
需求
需要更加是否是管理员(或者是否登录),增加隐藏博文的访问链接,便于自己查看隐藏文章,以及防止未登录用户查看,需要:
在导航栏根据是否管理员,增加显示一个导航 “隐藏博文”
点击“隐藏博文”,显示所有设置为“不公开”的博文列表,列表的顺序和显示方式和公开博文一样(使用相同模板index.html)
管理员退出登录后,隐藏掉导航”隐藏博文“
导航栏增加一个快捷的”登录“按钮
实现
模板修改navigator.html 中增加一传入参数 admin, 用来控制是否多显示一个导航:
<ul class="nav navbar-nav">
<li>
<a href="/index">博文</a>
</li>
{{if .admin}}
<li>
<a href="/hidden">隐藏博文</a>
</li>
{{end}}
<li>
<a href="/page/6">关于</a>
</li>
<li>
<a href="/rss" target="_blank">RSS</a>
</li>
<li>
<a href="/subscribe">订阅</a>
</li>
</ul>
增加一个登录导航按钮:
<ul class="nav navbar-nav">
{{if .user}}
<li>
<a href="/logout">退出登录</a>
</li>
{{else}}
<li>
<a href="/signin">登录</a>
</li>
<li>
<a href="/auth/github">Github登录</a>
</li>
{{end}}
</ul>
在common.go 增加一个函数,用来判断是否管理员登录:
func IsAdmin(c *gin.Context) bool {
s := sessions.Default(c)
v := s.Get(SESSION_KEY)
if v == nil {
return false
}
uid := v.(uint)
user, err := models.GetUser(uid)
if err != nil || user == nil {
return false
}
if user.IsAdmin {
return true
}
return false
}
在所有需要用到导航模板navigator.html的主模板使用场合,添加admin参数传递,如index.go中:
admin := IsAdmin(c)
user, _ := c.Get(CONTEXT_USER_KEY)
c.HTML(http.StatusOK, "index/index.html", gin.H{
"posts": posts,
"tags": models.MustListTag(),
"archives": models.MustListPostArchives(),
"links": models.MustListLinks(),
"user": user,
"admin": admin,
})
最后为了能够把主模板中的参数传递到子模板中,需要将柱模板的导入代码稍作修改,比如:
{{template "navigation.html"}}
改成:
{{template "navigation.html" .}}