Code Monkey home page Code Monkey logo

silhouette-vuejs-app's Introduction

Playframework authentication && user management sample

The goal of this project is to have starter project that covers basic authentication && user management functionality.

This is a Scala Playframework application that utilizes Silhouette as authentication library and Vuejs for frontend.

Demo app

See Demo on Heroku. Loading can take a while because it uses Heroku free dyno which is turned on/off every time if there is no activity for some time.

Brief description of functionality:

  • Sign up
  • Sign in
  • Email activation
  • Reset password
  • Change password
  • Authentication via social providers Facebook, Google, Twitter
  • SPA
  • Basic user management functionality (admin page, user roles)
  • ReCaptcha integration (signup form)
  • Password brute force protection (Default is 5 tries per 30 minutes, but can be configured)
  • User can link multiple sources (credentials, social providers) to his account

Backend technical details:

  • PlayFramework (Scala)
  • Silhouette authentication library
  • PlayFramework + VueJs integration (dev hot reload && prod static assets)
  • Sending emails via SendGrid
  • Postgres DB
  • Ready to deploy to Heroku

Frontend technical details:

  • VueJs
  • Vue JWT integration
  • Vue page access restriction for routes
  • Vue validation using vuelidate
  • Bulma
  • Buefy
  • Vuex for storing user data in local storage

Although this project uses VueJs on frontend it's easy to port to Angular/ReactJs/etc because frontend part it fully decoupled. Just replace code in vue directory for anything you like and it will work.

VueJs && PlayFramework integration [also applicable to Angular/React/ect]

On running application in prod mode, all frontend sources are compiled and moved to public directory where PlayFramework treats them as static assets.

On running application in dev mode, all frontend sources are proxied from Webpack server by PlayFramework, so hot reloading and other stuff work without magic.

How to run the project locally in dev mode

  1. Make sure you have sbt and npm installed

  2. Create devEnv.conf file in <project_root>/conf directory and specify there your keys. See example below

play.filters.headers.contentSecurityPolicy = "*"

silhouette {
  csrfStateItemHandler.signer.key="..."
  oauth1TokenSecretProvider.signer.key="..."
  oauth1TokenSecretProvider.crypter.key="..."
  authenticator.sharedSecret="..."
}

sendgrid.api.key = "..."

play.crypto.secret="..."

recaptcha.secretKey = "..."

  1. Run backend sbt run

  2. Make sure you have RECAPTCHA_SITEKEY environment variable or export it export RECAPTCHA_SITEKEY="..."

  3. Install frontend dependencies and run frontend cd vui && npm install && npm run serve

  4. Open your http://localhost:9000/ in your browser. That's PlayFramework bakend server which proxies all frontend assets so Hot

Running in production

  1. Build frontend code npm run build
  2. Compile play application for production sbt compile stage (frontend resources will be copied)
  3. Make sure you have all ENV params specified in application.conf such as JDBC_DATABASE_URL, DATABASE_USER, DATABASE_PWD, SENDGRID_API_KEY, RECAPTCHA_SECRETKEY, etc before running the app.

silhouette-vuejs-app's People

Contributors

akkie avatar anotherhale avatar jkutner avatar jptissot avatar oliverkk avatar sunpj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

silhouette-vuejs-app's Issues

`sbt` fails to load the project right after `git clone`

git clone [email protected]:SunPj/silhouette-vuejs-app.git
cd silhouette-vuejs-app
sbt

throws an error.

Silhouette Version (4.0.x / etc)

SunPj/silhouette-vuejs-app

Operating System (Ubuntu 15.10 / MacOS 10.10 / Windows 10)

18.7.0 Darwin Kernel Version 18.7.0: Tue Aug 20 16:57:14 PDT 2019; root:xnu-4903.271.2~2/RELEASE_X86_64 x86_64

JDK (Oracle 1.8.0_72, OpenJDK 1.8.x, Azul Zing)

Paste the output from java -version at the command line.

openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)

Library Dependencies

If this is an issue that involves integration with another system, include the exact version and OS of the other system, including any intermediate drivers or APIs i.e. if you connect to a PostgreSQL database, include both the version / OS of PostgreSQL and the JDBC driver version used to connect to the database.

Expected Behavior

sbt compile should work

Actual Behavior

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
copying runtime jar...
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[info] [launcher] getting org.scala-sbt sbt 0.13.11  (this may take some time)...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/actions/0.13.11/jars/actions.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/main/0.13.11/jars/main.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/interface/0.13.11/jars/interface.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/compiler-interface/0.13.11/jars/compiler-interface.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/ivy/0.13.11/jars/ivy.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/main-settings/0.13.11/jars/main-settings.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt/0.13.11/jars/sbt.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/io/0.13.11/jars/io.jar ...
:: loading settings :: url = jar:file:/usr/local/Cellar/sbt/1.3.8_1/libexec/bin/sbt-launch.jar!/org/apache/ivy/core/settings/ivysettings.xml
	[SUCCESSFUL ] org.scala-sbt#interface;0.13.11!interface.jar (1526ms)
	[SUCCESSFUL ] org.scala-sbt#actions;0.13.11!actions.jar (1530ms)
	[SUCCESSFUL ] org.scala-sbt#sbt;0.13.11!sbt.jar (1615ms)
	[SUCCESSFUL ] org.scala-sbt#io;0.13.11!io.jar (1613ms)
	[SUCCESSFUL ] org.scala-sbt#compiler-interface;0.13.11!compiler-interface.jar (1617ms)
	[SUCCESSFUL ] org.scala-sbt#main-settings;0.13.11!main-settings.jar (1619ms)
downloading https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.0.0-M1/launcher-interface-1.0.0-M1.jar ...
	[SUCCESSFUL ] org.scala-sbt#ivy;0.13.11!ivy.jar (1634ms)
	[SUCCESSFUL ] org.scala-sbt#launcher-interface;1.0.0-M1!launcher-interface.jar (55ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/logging/0.13.11/jars/logging.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/logic/0.13.11/jars/logic.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/run/0.13.11/jars/run.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/process/0.13.11/jars/process.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/command/0.13.11/jars/command.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/classpath/0.13.11/jars/classpath.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/completion/0.13.11/jars/completion.jar ...
	[SUCCESSFUL ] org.scala-sbt#main;0.13.11!main.jar (2105ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/api/0.13.11/jars/api.jar ...
	[SUCCESSFUL ] org.scala-sbt#logging;0.13.11!logging.jar (1441ms)
	[SUCCESSFUL ] org.scala-sbt#logic;0.13.11!logic.jar (1519ms)
	[SUCCESSFUL ] org.scala-sbt#command;0.13.11!command.jar (1432ms)
	[SUCCESSFUL ] org.scala-sbt#run;0.13.11!run.jar (1515ms)
	[SUCCESSFUL ] org.scala-sbt#process;0.13.11!process.jar (1516ms)
	[SUCCESSFUL ] org.scala-sbt#classpath;0.13.11!classpath.jar (1498ms)
	[SUCCESSFUL ] org.scala-sbt#completion;0.13.11!completion.jar (1556ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/compiler-integration/0.13.11/jars/compiler-integration.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/compiler-ivy-integration/0.13.11/jars/compiler-ivy-integration.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/relation/0.13.11/jars/relation.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/tasks/0.13.11/jars/tasks.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/task-system/0.13.11/jars/task-system.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/tracking/0.13.11/jars/tracking.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/testing/0.13.11/jars/testing.jar ...
	[SUCCESSFUL ] org.scala-sbt#api;0.13.11!api.jar (1525ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/control/0.13.11/jars/control.jar ...
	[SUCCESSFUL ] org.scala-sbt#compiler-integration;0.13.11!compiler-integration.jar (1478ms)
	[SUCCESSFUL ] org.scala-sbt#compiler-ivy-integration;0.13.11!compiler-ivy-integration.jar (1417ms)
downloading https://repo1.maven.org/maven2/jline/jline/2.13/jline-2.13.jar ...
	[SUCCESSFUL ] org.scala-sbt#relation;0.13.11!relation.jar (1418ms)
downloading https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.11/jansi-1.11.jar ...
	[SUCCESSFUL ] org.scala-sbt#task-system;0.13.11!task-system.jar (1422ms)
	[SUCCESSFUL ] org.scala-sbt#tracking;0.13.11!tracking.jar (1406ms)
	[SUCCESSFUL ] org.scala-sbt#tasks;0.13.11!tasks.jar (1424ms)
	[SUCCESSFUL ] org.fusesource.jansi#jansi;1.11!jansi.jar (91ms)
	[SUCCESSFUL ] jline#jline;2.13!jline.jar (94ms)
	[SUCCESSFUL ] org.scala-sbt#testing;0.13.11!testing.jar (1421ms)
downloading https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-2cc8d2761242b072cedb0a04cb39435c4fa24f9a/ivy-2.3.0-sbt-2cc8d2761242b072cedb0a04cb39435c4fa24f9a.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/collections/0.13.11/jars/collections.jar ...
	[SUCCESSFUL ] org.scala-sbt.ivy#ivy;2.3.0-sbt-2cc8d2761242b072cedb0a04cb39435c4fa24f9a!ivy.jar (155ms)
downloading https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.46/jsch-0.1.46.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/classfile/0.13.11/jars/classfile.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/incremental-compiler/0.13.11/jars/incremental-compiler.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/compile/0.13.11/jars/compile.jar ...
	[SUCCESSFUL ] com.jcraft#jsch;0.1.46!jsch.jar (62ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/persist/0.13.11/jars/persist.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/cross/0.13.11/jars/cross.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/cache/0.13.11/jars/cache.jar ...
	[SUCCESSFUL ] org.scala-sbt#collections;0.13.11!collections.jar (1374ms)
	[SUCCESSFUL ] org.scala-sbt#control;0.13.11!control.jar (2246ms)
	[SUCCESSFUL ] org.scala-sbt#compile;0.13.11!compile.jar (1427ms)
	[SUCCESSFUL ] org.scala-sbt#incremental-compiler;0.13.11!incremental-compiler.jar (1429ms)
	[SUCCESSFUL ] org.scala-sbt#cross;0.13.11!cross.jar (1480ms)
	[SUCCESSFUL ] org.scala-sbt#persist;0.13.11!persist.jar (1481ms)
	[SUCCESSFUL ] org.scala-sbt#classfile;0.13.11!classfile.jar (1511ms)
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/test-agent/0.13.11/jars/test-agent.jar ...
downloading https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/apply-macro/0.13.11/jars/apply-macro.jar ...
	[SUCCESSFUL ] org.scala-sbt#cache;0.13.11!cache.jar (1366ms)
	[SUCCESSFUL ] org.scala-sbt#test-agent;0.13.11!test-agent.jar (1323ms)
	[SUCCESSFUL ] org.scala-sbt#apply-macro;0.13.11!apply-macro.jar (1342ms)
:: retrieving :: org.scala-sbt#boot-app
	confs: [default]
	49 artifacts copied, 0 already retrieved
error: error while loading String, class file '/Users/victor/.sbt/0.13/java9-rt-ext-n_a_13_0_2/rt.jar(java/lang/String.class)' is broken
(class java.lang.NullPointerException/null)
[info] Loading project definition from /Users/victor/work/silhouette-vuejs-app/project
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by sbt.ivyint.ErrorMessageAuthenticator$ (file:/Users/victor/.sbt/boot/scala-2.10.6/org.scala-sbt/sbt/0.13.11/ivy-0.13.11.jar) to field java.net.Authenticator.theAuthenticator
WARNING: Please consider reporting this to the maintainers of sbt.ivyint.ErrorMessageAuthenticator$
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
java.lang.NullPointerException
	at java.base/java.util.regex.Matcher.getTextLength(Matcher.java:1770)
	at java.base/java.util.regex.Matcher.reset(Matcher.java:416)
	at java.base/java.util.regex.Matcher.<init>(Matcher.java:253)
	at java.base/java.util.regex.Pattern.matcher(Pattern.java:1134)
	at java.base/java.util.regex.Pattern.split(Pattern.java:1262)
	at java.base/java.util.regex.Pattern.split(Pattern.java:1335)
	at sbt.IO$.pathSplit(IO.scala:797)
	at sbt.IO$.parseClasspath(IO.scala:912)
	at sbt.compiler.CompilerArguments.extClasspath(CompilerArguments.scala:66)
	at sbt.compiler.MixedAnalyzingCompiler$.withBootclasspath(MixedAnalyzingCompiler.scala:188)
	at sbt.compiler.MixedAnalyzingCompiler$.searchClasspathAndLookup(MixedAnalyzingCompiler.scala:166)
	at sbt.compiler.MixedAnalyzingCompiler$.apply(MixedAnalyzingCompiler.scala:176)
	at sbt.compiler.IC$.incrementalCompile(IncrementalCompiler.scala:138)
	at sbt.Compiler$.compile(Compiler.scala:152)
	at sbt.Compiler$.compile(Compiler.scala:138)
	at sbt.Defaults$.sbt$Defaults$$compileIncrementalTaskImpl(Defaults.scala:860)
	at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:851)
	at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:849)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
	at sbt.std.Transform$$anon$4.work(System.scala:63)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
	at sbt.Execute.work(Execute.scala:237)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:830)
[error] (compile:compileIncremental) java.lang.NullPointerException
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

Reproducible Test Case

Two users might link one social account to their profile

Two users might link one social account to their profile but social profile will for only for one of them.
Liking social account should fail second time and show user some message like "This social account is already used by other user"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.