[JAVA] Fonction d'authentification avec Play Framework [Enregistrement et authentification]

Lors de la création d'une application Web, vous souhaitez souvent enregistrer les informations utilisateur et restreindre l'accès aux pages. Cette fois, j'ai essayé d'implémenter la fonction d'authentification à l'aide de Play Framework. La source peut être trouvée sur GitHub.

environnement

Fonctions à réaliser

--Enregistrement des informations utilisateur, authentification par vérification

Liste des écrans

organisation des fichiers

  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

Je pense que le nom du fichier transmet en quelque sorte le rôle.

Préparation de la base de données

Enregistrez les informations utilisateur saisies à partir de l'écran d'inscription dans la base de données. Sur l'écran de connexion, entrez votre adresse e-mail et votre mot de passe et vérifiez avec les informations de la base de données pour vous authentifier. Je souhaite stocker les informations utilisateur saisies dans le H2DB de la base de données en mémoire. Je souhaite utiliser Ebean, compatible avec Play, pour le mappeur O / R et Evolutions pour la gestion des bases de données. Pour utiliser H2DB, Ebean et Evolutions, modifiez les trois points suivants et rechargez et mettez à jour sbt.

build.sbt


lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean) //PlayEbean ajouté

libraryDependencies += evolutions //ajouter à

project/plugins.sbt


addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.0") //ajouter à

conf/application.conf


db {
  default.driver = org.h2.Driver
  default.url="jdbc:h2:mem:play;MODE=MYSQL" #Cette fois, le mode MySQL
  default.username = sa
  default.password = ""
}

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

Créez ensuite une classe de modèle d'objet Java contenant les informations de la base de données avec le package de modèles. Je voudrais créer une super classe pour la classe Model et définir la date et l'heure de création ainsi que la dernière date et heure de mise à jour pour toutes les tables. Cette fois, seule la table User est créée, donc cela n'a pas beaucoup de sens.

AppModel.java


package models;

//instruction d'importation omise

@MappedSuperclass
public abstract class AppModel extends Model {

	/** ID */
	@Id
	public Long id;
	
	/**Date et heure de création*/
	@CreatedTimestamp
	public LocalDateTime created;
	
	/**Dernière modification*/
	@UpdatedTimestamp
	public LocalDateTime updated;
	
}

User.java


package models;

//instruction d'importation omise

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

	/**adresse mail*/
	public String email;

	/**mot de passe*/
	public String password;
	
	/**Date et heure de la dernière connexion*/
	public LocalDateTime logined;
	
}

À ce stade, démarrez le serveur et accédez-y. Ensuite, l'écran suivant s'affichera sur le navigateur.
evolutions.png

Si vous appuyez sur le bouton "Appliquer ce script maintenant!" Tel quel, SQL sera exécuté et une table sera créée dans H2DB. De plus, le fichier SQL suivant sera généré dans conf / evolutions / default.

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;

Cela semble réveiller le schéma en regardant la classe Model qui donne l'annotation de javax.persistence.Entity.

Enregistrement et vérification des informations utilisateur

Maintenant que nous avons confirmé que la base de données a été créée, l'étape suivante consiste à créer un écran pour l'inscription et la connexion. Créez respectivement une vue et un formulaire et attribuez à l'élément une adresse e-mail et un mot de passe. J'ai également donné un nom à l'inscription. Cette fois, la source de View and Form est simple, je vais donc l'omettre. Si vous êtes intéressé, veuillez vous référer à GitHub. Aussi, veuillez vous référer à Post écrit sur View and Form dans la réalisation de la fonction de validation.

Le reste est traité par le contrôleur en utilisant les informations saisies à l'écran. Le contrôleur d'écran d'inscription enregistre votre nom, votre adresse e-mail et votre mot de passe en tant qu'informations utilisateur dans la base de données.

SignupController.java


package controllers;

//instruction d'importation omise

@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{
			/*
			 *Enregistrez de nouvelles informations utilisateur.
			 */
			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());
	}

}

Le contrôleur d'écran de connexion met à jour la date et l'heure de connexion de l'utilisateur avec l'adresse e-mail saisie.

SigninController.java


package controllers;

//instruction d'importation omise

@Singleton
public class SigninController extends AppController {
	@Inject
	private FormFactory formFactory;
	/**Clé d'informations utilisateur*/
	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{
			/*
			 *Mettez à jour la date et l'heure de connexion de l'utilisateur.
			 */
			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());
	}
	

	/*
	 *Les méthodes suivantes sont omises
	 */
	
}

Lors de l'enregistrement des informations utilisateur sur le contrôleur d'écran d'inscription, BCrypt est utilisé pour hacher le mot de passe.

build.sbt


libraryDependencies += "org.mindrot" % "jbcrypt" % "0.4" //ajouter à

Après avoir écrit, veuillez relancer et mettre à jour sbt à nouveau.

finalement

Cette fois, j'ai écrit sur la partie nécessaire pour enregistrer et rassembler les informations utilisateur. J'ai senti qu'il y avait de nombreuses parties que j'ai trouvées utiles pour la gestion et le fonctionnement de la base de données plutôt que pour l'authentification. Les restrictions d'accès non écrites cette fois sont écrites dans ici. GitHub

Recommended Posts

Fonction d'authentification avec Play Framework [Enregistrement et authentification]
Fonction d'authentification avec Play Framework [Restrictions d'accès]
Java pour jouer avec Function
Fonction de validation dans Play Framework
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Implémentez la fonction d'authentification avec Spring Security ③
Double soumission de mesures avec Play Framework
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Lancer les tâches planifiées et crontab
Comment utiliser BootStrap avec Play Framework
Implémentez la connexion, l'enregistrement des utilisateurs et l'authentification à deux facteurs avec Docker x Laravel 8 Jetstream
Etude Play Framework
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Gérez le cross-domain JSON avec Play Framework
[Rails] Implémentation de la fonction glisser-déposer (avec effet)
Jouez avec les nœuds de fonction Java qui peuvent utiliser Java avec Node-RED
Conseils pour Play Framework2.5 (Java)
Test d'étude de Play Framework
Avec Spring Boot, hachez le mot de passe et utilisez l'enregistrement des membres et la sécurité Spring pour implémenter la fonction de connexion.
jouer des notes personnelles de cadre
Avec Kotorin ―― 7. Fonction de cadrage
Fonction sans serveur avec Micronaut
[PHP8] Installer et utiliser la fonction YAML de PECL (analyseur YAML) avec Docker
Je veux créer une fonction avec kotlin et java!
[Java] [Play Framework] Jusqu'à ce que le projet soit démarré avec Gradle
Implémentez la fonction de connexion simplement avec le nom et le mot de passe dans Rails (3)
Implémenter la fonction d'enregistrement des utilisateurs et la fonction d'enregistrement de l'entreprise séparément dans Rails concevoir
Visualisez avec les outils de BI en liant Asakusa Framework et Impala