main.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #![allow(non_snake_case, unused)]
  2. #[cfg(feature = "server")]
  3. mod auth;
  4. use dioxus::prelude::*;
  5. use dioxus_fullstack::prelude::*;
  6. use serde::{Deserialize, Serialize};
  7. fn main() {
  8. // Set the logger ahead of time since we don't use `dioxus::launch` on the server
  9. dioxus::logger::initialize_default();
  10. #[cfg(feature = "web")]
  11. // Hydrate the application on the client
  12. LaunchBuilder::web().launch(app);
  13. #[cfg(feature = "server")]
  14. {
  15. use crate::auth::*;
  16. use axum::routing::*;
  17. use axum_session::SessionConfig;
  18. use axum_session::SessionStore;
  19. use axum_session_auth::AuthConfig;
  20. use axum_session_sqlx::SessionSqlitePool;
  21. tokio::runtime::Runtime::new()
  22. .unwrap()
  23. .block_on(async move {
  24. let pool = connect_to_database().await;
  25. //This Defaults as normal Cookies.
  26. //To enable Private cookies for integrity, and authenticity please check the next Example.
  27. let session_config = SessionConfig::default().with_table_name("test_table");
  28. let auth_config = AuthConfig::<i64>::default().with_anonymous_user_id(Some(1));
  29. let session_store = SessionStore::<SessionSqlitePool>::new(
  30. Some(pool.clone().into()),
  31. session_config,
  32. )
  33. .await
  34. .unwrap();
  35. User::create_user_tables(&pool).await;
  36. // build our application with some routes
  37. let app = Router::new()
  38. // Server side render the application, serve static assets, and register server functions
  39. .serve_dioxus_application(ServeConfig::new().unwrap(), app)
  40. .layer(
  41. axum_session_auth::AuthSessionLayer::<
  42. crate::auth::User,
  43. i64,
  44. SessionSqlitePool,
  45. sqlx::SqlitePool,
  46. >::new(Some(pool))
  47. .with_config(auth_config),
  48. )
  49. .layer(axum_session::SessionLayer::new(session_store));
  50. // serve the app using the address passed by the CLI
  51. let addr = dioxus::cli_config::fullstack_address_or_localhost();
  52. let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
  53. axum::serve(listener, app.into_make_service())
  54. .await
  55. .unwrap();
  56. });
  57. }
  58. }
  59. //
  60. fn app() -> Element {
  61. let mut user_name = use_signal(|| "?".to_string());
  62. let mut permissions = use_signal(|| "?".to_string());
  63. rsx! {
  64. div {
  65. button { onclick: move |_| {
  66. async move {
  67. login().await?;
  68. Ok(())
  69. }
  70. },
  71. "Login Test User"
  72. }
  73. }
  74. div {
  75. button {
  76. onclick: move |_| async move {
  77. let data = get_user_name().await?;
  78. user_name.set(data);
  79. Ok(())
  80. },
  81. "Get User Name"
  82. }
  83. "User name: {user_name}"
  84. }
  85. div {
  86. button {
  87. onclick: move |_| async move {
  88. let data = get_permissions().await?;
  89. permissions.set(data);
  90. Ok(())
  91. },
  92. "Get Permissions"
  93. }
  94. "Permissions: {permissions}"
  95. }
  96. }
  97. }
  98. #[server]
  99. pub async fn get_user_name() -> ServerFnResult<String> {
  100. let auth = auth::get_session().await?;
  101. Ok(auth.current_user.unwrap().username.to_string())
  102. }
  103. #[server]
  104. pub async fn login() -> ServerFnResult {
  105. let auth = auth::get_session().await?;
  106. auth.login_user(2);
  107. Ok(())
  108. }
  109. #[server]
  110. pub async fn get_permissions() -> ServerFnResult<String> {
  111. let method: axum::http::Method = extract().await?;
  112. let auth = auth::get_session().await?;
  113. let current_user = auth.current_user.clone().unwrap_or_default();
  114. // lets check permissions only and not worry about if they are anon or not
  115. if !axum_session_auth::Auth::<crate::auth::User, i64, sqlx::SqlitePool>::build(
  116. [axum::http::Method::POST],
  117. false,
  118. )
  119. .requires(axum_session_auth::Rights::any([
  120. axum_session_auth::Rights::permission("Category::View"),
  121. axum_session_auth::Rights::permission("Admin::View"),
  122. ]))
  123. .validate(&current_user, &method, None)
  124. .await
  125. {
  126. return Ok(format!(
  127. "User {}, Does not have permissions needed to view this page please login",
  128. current_user.username
  129. ));
  130. }
  131. Ok(format!(
  132. "User has Permissions needed. Here are the Users permissions: {:?}",
  133. current_user.permissions
  134. ))
  135. }