Elixir Phoenix上下文授权(带和不带)

Elixir Phoenix上下文授权(带和不带),elixir,phoenix-framework,Elixir,Phoenix Framework,我遵循了完整的教程,解释了@chrismccord如何处理上下文和身份验证/授权……我利用了他关于将auth与dockyard blog分离的帖子:slight_smile:和 根据这一点,在我的案例中(CMS是ENR)所有创建的学生都需要一个注册者,注册者通过自己的会话链接到一个用户(经过身份验证):Student->属于注册者,注册者->属于用户,用户有自己的凭证 resources”/students,StudentController受到保护,这很好 但现在我想揭露一些事实:如果我们想让

我遵循了完整的教程,解释了@chrismccord如何处理上下文和身份验证/授权……我利用了他关于将auth与dockyard blog分离的帖子:slight_smile:和

根据这一点,在我的案例中(CMSENR)所有创建的学生都需要一个注册者,注册者通过自己的会话链接到一个用户(经过身份验证):Student->属于注册者,注册者->属于用户,用户有自己的凭证

resources”/students,StudentController
受到保护,这很好

但现在我想揭露一些事实:如果我们想让学生自己注册怎么办?代码是什么样子的

用于自行注册或自行注册,而不是由管理员进行注册。。。会很好的

下面是我所做的,但我总是重定向到身份验证页面,结果是:“您必须登录”

  • 当管理员登录/注册时。。。。他/她可以完成以下允许的管理任务(创建:学生、注册者、页面等):

    scope”/enr,HelloWeb.enr,as::enr do
    管道通过[:浏览器,:验证用户]
    资源“/录取”,录取管理员
    结束
    
  • 对于入学的任务

  • 在前面提到的情况下,如果我们认为范围>代码> CMS < /C>或(<代码> Enr>代码>)是<强>管理部分,我们希望允许学生通过<强>公共部分登记自己:
    范围“/”,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准入路径(连接:索引))
    |>暂停
    结束
    结束
    结束
    
  • 另一个在CMS中

    defmodule InsWeb.AdmissionController do
    使用InsWeb,:控制器
    别名Ins.ENR
    别名Ins.ENR.ALICTION
    def新(连接,参数)do
    changeset=ENR.change\u许可(%acmission{})
    渲染(康涅狄格州)