[JAVA] Authentifizierungsfunktion mit Play Framework [Registrierung und Authentifizierung]

Beim Erstellen einer Webanwendung möchten Sie häufig Benutzerinformationen registrieren und den Seitenzugriff einschränken. Dieses Mal habe ich versucht, die Authentifizierungsfunktion mit Play Framework zu implementieren. Die Quelle finden Sie unter GitHub.

Umgebung

Zu realisierende Funktionen

Bildschirmliste

Dateiorganisation

  PlayAuthentication
     ├── app
     │   ├── common
     │   │   ├── global
     │   │   │   └── AppActionCreator.java
     │   │   └── secure
     │   │       └── AppAuthenticator.java
     │   ├── controllers
     │   │   ├── AppController.java
     │   │   ├── IndexController.java
     │   │   ├── SigninController.java
     │   │   └── SignupController.java
     │   ├── forms
     │   │   ├── AppForm.java
     │   │   ├── SigninForm.java
     │   │   └── SignupForm.java
     │   ├── models
     │   │   ├── AppModel.java
     │   │   └── User.java
     │   └── views
     │       ├── index.scala.html
     │       ├── main.scala.html
     │       ├── signin.scala.html
     │       └── signup.scala.html
     ├── build.sbt
     ├── conf
     │   ├── application.conf
     │   ├── evolutions
     │   │   └── default
     │   │       └── 1.sql
     │   └── routes
     └── project
         └── plugins.sbt

Ich denke, dass der Dateiname irgendwie die Rolle vermittelt.

Datenbankvorbereitung

Registrieren Sie die über den Anmeldebildschirm eingegebenen Benutzerinformationen in der Datenbank. Geben Sie auf dem Anmeldebildschirm Ihre E-Mail-Adresse und Ihr Kennwort ein und überprüfen Sie die DB-Informationen zur Authentifizierung. Ich möchte die eingegebenen Benutzerinformationen in der H2DB der In-Memory-Datenbank speichern. Ich möchte Ebean, das mit Play kompatibel ist, für den O / R-Mapper und Evolutions für die Datenbankverwaltung verwenden. Um H2DB, Ebean und Evolutions zu verwenden, ändern Sie die folgenden drei Punkte und laden und aktualisieren Sie sbt neu.

build.sbt


lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean) //PlayEbean hinzugefügt

libraryDependencies += evolutions //hinzufügen

project/plugins.sbt


addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.0") //hinzufügen

conf/application.conf


db {
  default.driver = org.h2.Driver
  default.url="jdbc:h2:mem:play;MODE=MYSQL" #Diesmal MySQL-Modus
  default.username = sa
  default.password = ""
}

ebean {
  default = ["models.*"]
}

Erstellen Sie dann eine Java-Objektmodellklasse, die die Datenbankinformationen zusammen mit dem Modellpaket enthält. Ich möchte eine Superklasse für die Modellklasse erstellen und das Erstellungsdatum und die Erstellungszeit sowie das Datum und die Uhrzeit der letzten Aktualisierung für alle Tabellen definieren. Dieses Mal wird nur die Benutzertabelle erstellt, daher ist dies nicht sehr sinnvoll.

AppModel.java


package models;

//Importanweisung weggelassen

@MappedSuperclass
public abstract class AppModel extends Model {

	/** ID */
	@Id
	public Long id;
	
	/**Erstellungsdatum und -zeit*/
	@CreatedTimestamp
	public LocalDateTime created;
	
	/**Zuletzt geändert*/
	@UpdatedTimestamp
	public LocalDateTime updated;
	
}

User.java


package models;

//Importanweisung weggelassen

@Entity
public class User extends AppModel {
	
	/**Name*/
	public String name;

	/**Mail Adresse*/
	public String email;

	/**Passwort*/
	public String password;
	
	/**Datum und Uhrzeit der letzten Anmeldung*/
	public LocalDateTime logined;
	
}

Starten Sie zu diesem Zeitpunkt den Server und greifen Sie darauf zu. Anschließend wird der folgende Bildschirm im Browser angezeigt.
evolutions.png

Wenn Sie auf die Schaltfläche "Dieses Skript jetzt anwenden!" Drücken, wird SQL ausgeführt und eine Tabelle in H2DB erstellt. Darüber hinaus wird die folgende SQL-Datei in conf / evolutions / default generiert.

1.sql


# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups

create table user (
  id                            bigint not null,
  name                          varchar(255),
  email                         varchar(255),
  password                      varchar(255),
  logined                       timestamp,
  created                       timestamp not null,
  updated                       timestamp not null,
  constraint pk_user primary key (id)
);
create sequence user_seq;


# --- !Downs

drop table if exists user;
drop sequence if exists user_seq;

Dies scheint das Schema zu wecken, indem man sich die Model-Klasse ansieht, die die Annotation von javax.persistence.Entity enthält.

Registrierung und Überprüfung von Benutzerinformationen

Nachdem wir bestätigt haben, dass die Datenbank erstellt wurde, erstellen wir einen Bildschirm zum Anmelden und Anmelden. Erstellen Sie eine Ansicht bzw. ein Formular und geben Sie dem Artikel eine E-Mail-Adresse und ein Kennwort. Ich habe der Anmeldung auch einen Namen gegeben. Dieses Mal ist die Quelle für Ansicht und Form einfach, daher werde ich sie weglassen. Bei Interesse lesen Sie bitte GitHub. Lesen Sie auch den Beitrag, der bei der Realisierung der vlidation-Funktion über Ansicht und Form geschrieben hat.

Der Rest wird von der Steuerung unter Verwendung der vom Bildschirm eingegebenen Informationen verarbeitet. Der Anmeldebildschirm-Controller speichert Ihren Namen, Ihre E-Mail-Adresse und Ihr Kennwort als Benutzerinformationen in der Datenbank.

SignupController.java


package controllers;

//Importanweisung weggelassen

@Singleton
public class SignupController extends AppController {
	@Inject
	public SignupController(CacheApi cache) {
		super(cache);
	}
	@Inject
	private FormFactory formFactory;
	
	@Override
	public Result get() {
		Form<SignupForm> form = formFactory.form(SignupForm.class);
		return ok(views.html.signup.render(form));
	}

	@Override
	public Result post() {
		Form<SignupForm> form = formFactory.form(SignupForm.class).bindFromRequest();
		if(form.hasErrors()){
			return badRequest(views.html.signup.render(form));
		}
		
		try{
			/*
			 *Registrieren Sie neue Benutzerinformationen.
			 */
			Ebean.beginTransaction();
			User user = new User();
			user.name = form.get().name;
			user.email = form.get().email;
			user.password = BCrypt.hashpw(form.get().password, BCrypt.gensalt());
			user.logined = LocalDateTime.now();
			Ebean.insert(user);
			Ebean.commitTransaction();
			new SigninController(cache).setCacheUser(user);
		}catch(Exception e){
			Ebean.rollbackTransaction();
			return badRequest(views.html.signup.render(form));
		}finally {
			Ebean.endTransaction();
		}
		
		return redirect(routes.IndexController.get());
	}

}

Der Anmeldebildschirm-Controller aktualisiert das Anmeldedatum und die Anmeldezeit des Benutzers mit der eingegebenen E-Mail-Adresse.

SigninController.java


package controllers;

//Importanweisung weggelassen

@Singleton
public class SigninController extends AppController {
	@Inject
	private FormFactory formFactory;
	/**Benutzerinformationsschlüssel*/
	public static final String USER_KEY = "USER";
	
	@Inject
	public SigninController(CacheApi cache) {
		super(cache);
	}

	@Override
	public Result get() {
		Form<SigninForm> form = formFactory.form(SigninForm.class);
		return ok(views.html.signin.render(form));
	}

	@Override
	public Result post() {
		Form<SigninForm> form = formFactory.form(SigninForm.class).bindFromRequest();
		if(form.hasErrors()){
			return badRequest(views.html.signin.render(form)); 
		}
		
		try{
			/*
			 *Aktualisieren Sie das Anmeldedatum und die Anmeldezeit des Benutzers.
			 */
			Ebean.beginTransaction();
			User user = Ebean.find(User.class).where().eq("email", form.get().email).findUnique();
			user.logined = LocalDateTime.now();
			Ebean.update(user);
			Ebean.commitTransaction();
			setCacheUser(user);
		}catch(Exception e){
			Ebean.rollbackTransaction();
			return badRequest(views.html.signin.render(form)); 
		}finally {
			Ebean.endTransaction();
		}
	
		return redirect(routes.IndexController.get());
	}
	

	/*
	 *Die folgenden Methoden werden weggelassen
	 */
	
}

BCrypt wird verwendet, um das Kennwort beim Speichern von Benutzerinformationen auf dem Anmeldebildschirm-Controller zu hashen.

build.sbt


libraryDependencies += "org.mindrot" % "jbcrypt" % "0.4" //hinzufügen

Nach dem Schreiben bitte sbt neu laden und sbt erneut aktualisieren.

Schließlich

Dieses Mal schrieb ich über den Teil, der zum Registrieren und Sammeln von Benutzerinformationen erforderlich ist. Ich hatte das Gefühl, dass es viele Teile gab, die ich eher für die Datenbankverwaltung und den Datenbankbetrieb als für die Authentifizierung nützlich fand. Zugriffsbeschränkungen, die diesmal nicht geschrieben wurden, sind in hier geschrieben. GitHub

Recommended Posts

Authentifizierungsfunktion mit Play Framework [Registrierung und Authentifizierung]
Authentifizierungsfunktion mit Play Framework [Zugriffsbeschränkungen]
Java zum Spielen mit Function
Validierungsfunktion in Play Framework
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Doppelte Übermittlung von Maßnahmen mit Play Framework
Implementierte Authentifizierungsfunktion mit Spring Security ①
Spielen Sie geplante Framework-Jobs und Crontab
Verwendung von BootStrap mit Play Framework
Implementieren Sie die Anmeldung, Benutzerregistrierung und Zwei-Faktor-Authentifizierung mit Docker x Laravel 8 Jetstream
Spielen Sie die Framework-Studie
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Behandeln Sie JSON domänenübergreifend mit Play Framework
[Rails] Implementierung der Drag & Drop-Funktion (mit Wirkung)
Spielen Sie mit Java-Funktionsknoten, die Java mit Node-RED verwenden können
Spielen Sie Framework2.5 (Java) -Tipps
Spielen Sie den Framework-Lerntest
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
spielen Framework persönliche Notizen
Mit Kotorin ―― 7. Scoping-Funktion
Serverlose Funktion mit Micronaut
[PHP8] Installieren und verwenden Sie die YAML-Funktion (YAML-Parser) von PECL mit Docker
Ich möchte eine Funktion mit Kotlin und Java erstellen!
[Java] [Play Framework] Bis das Projekt mit Gradle gestartet wird
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (3).
Implementieren Sie die Benutzerregistrierungsfunktion und die Unternehmensregistrierungsfunktion separat in Rails devise
Visualisieren Sie mit BI-Tools, indem Sie Asakusa Framework und Impala verbinden