#user #authentication #rocket #session #user-management #high-level #create-user

rocket_auth

为 Rocket 应用程序提供高级认证管理库。它支持 SQLite 和 Postgres。

8 个不稳定版本 (3 个破坏性更新)

0.4.0 2021 年 8 月 24 日
0.3.0 2021 年 4 月 25 日
0.2.1 2021 年 4 月 2 日
0.2.0 2021 年 3 月 31 日
0.1.3 2021 年 3 月 29 日

#5 in #create-user

MIT/Apache

76KB
1.5K SLoC

rocket_auth

rocket_auth 为认证管理提供了一个后端无关的、可直接使用的 API。它支持 SQLite 和 Postgresql 的连接。它允许您创建、删除和认证用户。提供的功能包括

  • sqlx-sqlite:用于使用 sqlx 与 SQLite 数据库交互。
  • sqlx-postgres:用于使用 sqlx 与 Postgresql 数据库交互。
  • sqlx-mysql:用于使用 sqlx 与 MySql 数据库交互。
  • redis:用于使用 redis 在 redis 服务器上存储会话。
  • rusqlite:用于使用 rusqlite 与 SQLite 数据库交互。
  • tokio-postgres:用于使用 tokio-postgres 与 Postgresql 数据库交互。

rocket_auth 使用私有饼干来存储会话数据。这意味着为了在启动之间正确解密饼干,必须设置一个 secret_key。有关更多信息,请访问 Rocket 的 配置指南

要使用 rocket_auth,请将其作为依赖项包含在您的 Cargo.toml 文件中

[dependencies.rocket_auth]
version = "0.4.0"
features = ["sqlx-sqlite"]

快速概述

该软件包提供了三个守卫

  • Auth:管理认证。
  • Session:用于从客户端饼干检索会话数据。
  • User:用于限制内容,使其只能由认证客户端查看。

它还包括两个结构,用于解析表单和 JSON 数据

  • Signup:用于创建新用户。
  • Login:用于认证用户。

最后,它有两个查询结构

  • Users:允许查询数据库中的用户。
  • User:是查询的响应。

Auth 守卫允许登录、注销、注册、修改和删除当前(未)认证用户。有关更多信息,请参阅 Auth。一个工作示例

use rocket::{get, post, form::Form, routes};
use rocket_auth::{Users, Error, Auth, Signup, Login};

#[post("/signup", data="<form>")]
async fn signup(form: Form<Signup>, auth: Auth<'_>) -> Result<&'static str, Error> {
    auth.signup(&form).await?;
    auth.login(&form.into());
    Ok("You signed up.")
}

#[post("/login", data="<form>")]
async fn login(form: Form<Login>, auth: Auth<'_>) -> Result<&'static str, Error>{
    auth.login(&form).await?;
    Ok("You're logged in.")
}

#[get("/logout")]
fn logout(auth: Auth<'_>) {
    auth.logout();
}
#[tokio::main]
async fn main() -> Result<(), Error>{
    let users = Users::open_sqlite("mydb.db").await?;

    rocket::build()
        .mount("/", routes![signup, login, logout])
        .manage(users)
        .launch();
    Ok(())
}

Users 结构体

Users 结构体管理与数据库的交互。它允许您查询、创建、修改和删除用户。与 Auth 守卫不同,Users 实例可以管理数据库中的任何用户。请注意,Auth 守卫包含存储在公共 users 字段上的 Users 实例。因此,在使用 Auth 时不需要检索 Users。以下是一个使用 Users 结构体查询用户的简单示例

use rocket_auth::Users;

#[get("/see-user/<id>")]
async fn see_user(id: i32, users: &State<Users>) -> String {
    let user = users.get_by_id(id).await.unwrap();
    format!("{}", json!(user))
}

可以通过使用 open_sqliteopen_postgres 方法将 Users 实例与数据库连接起来。此外,还可以从一个工作连接中构造它。

用户守卫

User 守卫可用于限制内容,使其只能由经过身份验证的用户查看。此外,您还可以使用它来根据客户端是否经过身份验证渲染特殊内容。

#[get("/private-content")]
fn private_content(user: User) -> &'static str {
    "If you can see this, you are logged in."
}

#[get("/special-content")]
fn special_content(option: Option<User>) -> String {
    if let Some(user) = option {
        format!("hello, {}.", user.email())
    } else {
        "hello, anonymous user".into()
    }
}
#[get("/admins-only")]
fn admins_only(user: AdminUser) -> &'static str {
   "Hello administrator."
}

管理员用户守卫

AdminUser 守卫可以像 User 一样使用。它将限制内容,使其只能由管理员查看。

# use rocket::*;
# use rocket_auth::AdminUser;
#[get("/admin-panel")]
fn admin_panel(user: AdminUser) -> String {
   format!("Hello {}.", user.email());
}

依赖关系

~22–59MB
~1M SLoC