상황:
고객용으로 회원가입시 고객 그룹인 "client"가 자동으로 추가되고,
업체용인 경우는 "partner"가 그룹으로 추가되도록 한다.
(매개변수 활용)
1) 고객용 회원가입 페이지 접속시 "client" 값을 인자로 지정한다.
| def signup(request): ctx = { "is_client" : True } return common_signup(request, ctx, "client") | cs |
2-1) group 매개변수를 통해 "client" 인자를 넘겨 받고, user에 "client" 그룹을 추가한다.
2-2) Group 클래스는 User 클래스와 ManyToMany 관계로 user.groups로 데이터 접근이 가능하다.
| def common_signup(request, ctx, group): if request.method == "GET": pass elif request.method == "POST": username = request.POST.get("username") email = request.POST.get("email") password = request.POST.get("password") user = User.objects.create_user(username, email, password) target_group = Group.objects.get(name=group) user.groups.add(target_group) | cs |
3) client로 회원가입한 경우 고객용 로그인 페이지, partner로 가입한 경우 업체용 페이지로 리다이렉트한다.
| if group == "partner": return redirect("/partner/login/") else: return redirect("/login/") return render(request, "signup.html", ctx) | cs |
4) 고객용 회원가입은 인자를 "partner"로 변경하면 된다.
| def signup(request): ctx = {} return common_signup(request, ctx, "partner") | cs |
**
상황:
고객이 로그인 시도할 경우 고객 그룹 소속여부에 따라 로그인처리를 한다.
고객 그룹이 아닐시 "접근 불가" 메세지를 노출시킨다.
1)
| def login(request): ctx = { "is_client" : True } return common_login(request, ctx, "client") | cs |
2) group 매개변수로 받은 "client" 인자와 조건문을 통해 해당 유저가 속한 그룹과 대조를 한다. 실패시 에러메세지를 출력한다.
| def common_login(request, ctx, group): if request.method == "GET": pass elif request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user = authenticate(username=username, password=password) if user is not None: if group not in [group.name for group in user.groups.all()]: ctx.update({ "error" : "접근 권한이 없습니다." }) | cs |
3) 로그인에 성공시 속한 그룹에 따라 메인페이지를 달리한다.
| else: auth_login(request, user) next_value = request.GET.get("next") if next_value: return redirect(next_value) else: if group == "partner": return redirect("/partner/") else: return redirect("/") | cs |