如果警卫失败,如何重定向

发布于 2025-01-19 08:08:46 字数 840 浏览 4 评论 0原文

我正在使用守卫来验证用户身份。

如果防护失败,我如何轻松地将用户重定向到登录页面(在我的示例中重定向到 /login)?

#[rocket::async_trait]
impl<'r> FromRequest<'r> for User {
    type Error = ();

    async fn from_request(request: &'r Request<'_>) -> Outcome<User, ()> {
        let db = request.guard::<&State<Db>>().await.succeeded().unwrap();
        
        /* Get user_id cookie */
        let c = request.cookies().get_private("user_id");

        match c {
            Some(c) => {
                ...
                Outcome::Success(user)
            },
            None => {
                Outcome::Failure((Status::BadRequest, ()))
            }
        }
    }
}

#[get("/")]
async fn home(user: User) -> Template {
   ...
}

#[get("/login")]
async fn login() -> Template {
   ...
}

I'm using a guard to authenticated a user.

How can i easily redirect the user to the login page if a guard fail (redirect to /login in my example) ?

#[rocket::async_trait]
impl<'r> FromRequest<'r> for User {
    type Error = ();

    async fn from_request(request: &'r Request<'_>) -> Outcome<User, ()> {
        let db = request.guard::<&State<Db>>().await.succeeded().unwrap();
        
        /* Get user_id cookie */
        let c = request.cookies().get_private("user_id");

        match c {
            Some(c) => {
                ...
                Outcome::Success(user)
            },
            None => {
                Outcome::Failure((Status::BadRequest, ()))
            }
        }
    }
}

#[get("/")]
async fn home(user: User) -> Template {
   ...
}

#[get("/login")]
async fn login() -> Template {
   ...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

咽泪装欢 2025-01-26 08:08:46

AS doc Illine:

use rocket::response::Redirect;

#[get("/", rank = 2)]
async fn not_user() -> Redirect {
   Redirect::to(uri!(login))
}

As doc illustrate:

use rocket::response::Redirect;

#[get("/", rank = 2)]
async fn not_user() -> Redirect {
   Redirect::to(uri!(login))
}
乱世争霸 2025-01-26 08:08:46

注册 401 捕手:

https://api .rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.register

use rocket::Request;
    
#[catch(401)]
fn not_authorized(req: &Request) -> Redirect {
    // redirect here
}

#[launch]
fn rocket() -> _ {
    rocket::build().register("/", catchers![not_authorized])
}

Register a 401 catcher:

https://api.rocket.rs/v0.5-rc/rocket/struct.Rocket.html#method.register

use rocket::Request;
    
#[catch(401)]
fn not_authorized(req: &Request) -> Redirect {
    // redirect here
}

#[launch]
fn rocket() -> _ {
    rocket::build().register("/", catchers![not_authorized])
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文