1、‘未经授权的访问’如何控制?

 

            <form class="form-signin" action="{% url 'account:login' %}" method="post">
                {% csrf_token %}
                {% comment %}<label for="inputEmail" class="sr-only">Email address</label>
                <input type="email" id="inputEmail" class="form-control" placeholder="Email" required autofocus>
                <label for="inputPassword" class="sr-only">Password</label>
                <input type="password" id="inputPassword" class="form-control" placeholder="Password" required>{% endcomment %}
                {{ form.non_field_errors }}
                {% for field in form %}
                    {{ field }}
                    {{ field.errors }}
                {% endfor %}

                <input type="hidden" name="next" value="{{ redirect_to }}">
                <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>

                <div class="checkbox">
                    {% comment %}<a class="pull-right">Need help?</a>{% endcomment %}
                    <label>
                        <input type="checkbox" value="remember-me" name="remember"> Stay signed in
                    </label>
                </div>
                {% load oauth_tags %}
                {% load_oauth_applications request%}
            </form>

 在模板定义了一个表单form,实参action指定发送到视图的login. 我们则使用 {% csrf_token%} 来防止攻击者利用表单来获得对服务器未经授权的访问。攻击称为跨站请求伪造。

2、如何让用户拥有自己的数据

django提供了装饰器 @login_required 只允许已登录用户访问某些页面。装饰器需要放到函数前面来修饰。

如下面限制只能是已登录用户查看所有主题。需要从django里导入如下第4行。

 让用户有自己的数据,首先就是在新建的数据中有当前的用户信息。

owner = models.ForeignKey(User, on_delete=models.CASCADE)

想让用户只能访问自己的数据就在查询时过滤数据,数据=当前用户。

topics = Topic.objects.filter(owner=request.user).order_by('date_added')
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Topic(models.Model):
    """ user learning topic"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)  #数据中关联用户信息
    def __str__(self):
        """return string of model"""
        return self.text
@login_required
def topics(request):
    """显示所有主题"""
    # topics = Topic.objects.order_by('date_added')
    topics = Topic.objects.filter(owner=request.user).order_by('date_added') #展示的主题是当前用户的数据
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

保护非当前用户不准修改数据。

if topic.owner != request.user:
@login_required
def topic(request, topic_id):
    """显示单个主题所有内容"""
    topic = Topic.objects.get(id=topic_id)
    #确认请求的主题是当前用户
    if topic.owner != request.user:  #保护数据,操作用户!=数据拥有者,报错404
        raise Http404
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

 

posted on 2023-09-05 14:54  白灰  阅读(13)  评论(0编辑  收藏  举报