Elixir Phoenix上下文授权(带和不带)
我遵循了完整的教程,解释了@chrismccord如何处理上下文和身份验证/授权……我利用了他关于将auth与dockyard blog分离的帖子:slight_smile:和 根据这一点,在我的案例中(CMS是ENR)所有创建的学生都需要一个注册者,注册者通过自己的会话链接到一个用户(经过身份验证):Student->属于注册者,注册者->属于用户,用户有自己的凭证Elixir Phoenix上下文授权(带和不带),elixir,phoenix-framework,Elixir,Phoenix Framework,我遵循了完整的教程,解释了@chrismccord如何处理上下文和身份验证/授权……我利用了他关于将auth与dockyard blog分离的帖子:slight_smile:和 根据这一点,在我的案例中(CMS是ENR)所有创建的学生都需要一个注册者,注册者通过自己的会话链接到一个用户(经过身份验证):Student->属于注册者,注册者->属于用户,用户有自己的凭证 resources”/students,StudentController受到保护,这很好 但现在我想揭露一些事实:如果我们想让
resources”/students,StudentController
受到保护,这很好
但现在我想揭露一些事实:如果我们想让学生自己注册怎么办?代码是什么样子的
用于自行注册或自行注册,而不是由管理员进行注册。。。会很好的
下面是我所做的,但我总是重定向到身份验证页面,结果是:“您必须登录”
scope”/enr,HelloWeb.enr,as::enr do
管道通过[:浏览器,:验证用户]
资源“/录取”,录取管理员
结束
范围“/”,InsWeb do
管道通过:浏览器#使用默认的浏览器堆栈
获取“/”,页面控制器:索引
资源“/用户”,用户控制器
资源“/sessions”,SessionController,仅:[:新建,:创建,:删除],
辛格尔顿:没错
资源“/录取”,录取管理员,仅:[:新建,:创建,:显示]
结束
范围“/ENR”,InsWeb.ENR,as::ENR do
管道通过[:浏览器,:验证用户]
资源“/录取”,录取管理员
结束
defp验证用户(conn,u)do
案例获取会话(conn,用户id)do
零->
康涅狄格州
|>Phoenix.Controller.put_flash(:错误,“需要登录”)
|>Phoenix.Controller.redirect(到“/”)
|>暂停
用户id->
分配(conn,当前用户,Ins.Accounts.get用户!(用户id))
结束
结束
一切似乎都很好,我通过公共部分进入了入学页面,但当我提交表格时,我总是得到“需要登录”
所以不可能允许学生自行注册
CMS(ENRin在我的案例中)范围中的AdmissionController.ex
如下所示:
defmodule InsWeb.ENR.AdmissionController do
使用InsWeb,:控制器
插件:需要现有注册者
插件:在[:编辑,:更新,:删除]
别名Ins.ENR
别名Ins.ENR.ALICTION
def索引(conn,_参数)do
入学人数=注册登记表(入学人数)
呈现(康涅狄格州,“index.html”,录取:录取)
结束
def新(连接,参数)do
changeset=ENR.change\u许可(%acmission{})
呈现(conn,“new.html”,变更集:变更集)
结束
def create(conn,%%{“acmission”=>acmission_params})do
案例注册创建注册(conn.assignments.current注册者、注册参数)do
{:好的,入场券}->
康涅狄格州
|>put_flash(:info,“已成功创建入场证”)
|>重定向(至:enr_准入_路径(conn,:show,准入))
{:错误,%Ecto.Changeset{}=Changeset}->
呈现(conn,“new.html”,变更集:变更集)
结束
结束
def show(conn,%{“id”=>id})do
入学人数=
身份证件
|>获得入学许可!()
|>ENR.inc.许可证和视图()
呈现(conn,“show.html”,准入:准入)
结束
定义编辑(conn,%{“id”=>id})do
入场券=ENR.get_入场券!(id)
变更集=注册变更入学(入学)
呈现(conn,“edit.html”,准入:准入,变更集:变更集)
结束
def更新(conn,%%{“id”=>id,“准入”=>准入参数})执行
入场券=ENR.get_入场券!(id)
案例登记更新登记(连接分配登记,登记参数)是否
{:好的,入场券}->
康涅狄格州
|>put_flash(:info,“入院信息已成功更新”)
|>重定向(至:enr_准入_路径(conn,:show,准入))
{:错误,%Ecto.Changeset{}=Changeset}->
呈现(conn,“edit.html”,准入:准入,变更集:变更集)
结束
结束
def delete(conn,%%{“id”=>id})do
入场券=ENR.get_入场券!(id)
{:好的,{u acmission}=ENR.delete{u acmission(conn.assigns.acmission)
康涅狄格州
|>put_flash(:info,“已成功删除入学记录”)
|>重定向(到:enr\u准入路径(连接:索引))
结束
defp需要现有注册者(conn,u)do
enroller=ENR.确保注册者存在(conn.assignments.current用户)
分配(连接:当前注册者,注册者)
结束
defp授权进入(控制室)do
入场券=ENR.get_入场券!(连接参数[“id”])
如果conn.assigns.current_enroller.id==admission.enroller_id do
分配(控制室:入学,入学)
其他的
康涅狄格州
|>put_flash(:错误,“您不能修改该准入页面”)
|>重定向(到:enr\u准入路径(连接:索引))
|>暂停
结束
结束
结束
defmodule InsWeb.AdmissionController do
使用InsWeb,:控制器
别名Ins.ENR
别名Ins.ENR.ALICTION
def新(连接,参数)do
changeset=ENR.change\u许可(%acmission{})
渲染(康涅狄格州)