写在前面
因为本站的文章创作是在后台进行(不要问我为什么不搬到前台来,问就是懒),那如果有多个作者,应该限制该作者仅可以修改自己发布的文章
而且作者在修改自己的个人信息时,不应该将权限模块呈现出来,不然人均superuser,那我这个管理员就废废的了
由此引发了另外一个问题,本站是开源的,如果有人根据源码写了脚本,获取cookie和csrf_token,带上参数发起post请求更改权限呢?如果这么做有效的话,那就是一个严重的安全漏洞,所幸,测试之后发现除了展示给用户的部分,其他参数都是无效的
当然,对我而言担心是多余的,目前网站的用户只有我一个。
如果你想把本站源码修改为开放的博客平台,还有一个缓存问题需要解决。
筛选文章
每一篇文章都有对应的change_url,重写以下方法后,如果作者根据文章id构造不属于自己的文章url,进行访问会提示文章不存在。安全性具有保证
"""
重写ArticleAdmin的get_queryset方法
根据请求的用户返回不同的内容
"""
def get_queryset(self, request):
qs = super(ArticlelAdmin, self).get_queryset(request)
#如果是管理员,则返回所有文章
if request.user.is_superuser:
return qs
#否则返回该用户的文章
return qs.filter(author=request.user)
用户资料
"""
在UserAdmin中,如果要限定可修改的内容,使用fields或exclude是无效的
通过dir(模块名),发现可以通过修改fieldset来实现想要的结果
"""
def get_queryset(self,request):
users = super(BlogUserAdmin,self).get_queryset(request)
#如果是管理员,则可以修改用户的全部属性,并返回全部用户条目
if request.user.is_superuser:
self.fieldsets = (('账号信息', {'fields': ('username', 'nickname', 'email','password')}), ('权限', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('重要日期', {'fields': ('last_login', 'date_joined')}))
return users
else:
#如果非管理员,则只允许访问和修改部分信息
self.fieldsets = (('账号信息', {'fields': ('username', 'nickname', 'email', 'password')}),)
#用户条目只返回本人
return users.filter(id=request.user.id)
关于缓存
本站的缓存机制是memcached,缓存对于提高网站的访问速度有重要作用,但作为管理者,我们希望缓存是可控的。原作者提供了一个用于清除缓存的接口,经过尝试发现作用不大,我开始怀疑是不是nginx或者uwsgi的缓存,重启nginx发现缓存仍然存在,再尝试uwsgi的reload命令,ok,缓存全没了,到这里仍然不能确定问题的症结所在,我在作者提供的接口里import uwsgi
,然后执行uwsgi.cache_clear(),再次调用接口,发现新生成缓存并未被清理掉,或许还能考虑下是不是浏览器缓存。。好吧,这个问题暂且搁置。如果找到解决办法我再来更新。