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.
--Enregistrement des informations utilisateur, authentification par vérification
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.
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.
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.
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.
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