Помогите написать систему ролей без использования Spring
Задание: написать онлайн-магазин. Роли: просмотр списков товаров доступен всем. добавление\удаление\обновление доступно только администратору. покупка - только для залогиненных пользователей.
Может, создать enum ролей А потом добавлять всех пользователей в Map<Role, User>? А как потом? что-то вообще ничего не приходит
Ответы (1 шт):
Давайте организуем простейшее хранилище данных. Для этого создадим объект User:
class User {}
В нём мы будем хранить все данные о конкретном пользователе. Допустим мы имеем следующие данные:
enum Premission {
USER,
ADMIN,
}
class User {
public String Login;
String password;
public Premission premission = Premission.USER;
}
Теперь добавим конструктор для создания пользователя и методы для верефикации и изменения пароля:
class User {
// ...
public User(String login, String password){
Login = login; this.password = password;
}
public boolean MatchPassword(String password){
return this.password == password
}
public User SetPassword(String newPassword){
password = newPassword;
return this;
}
}
В будущем в этот класс мы сможем легко добавлять новые поля с данными
Теперь создадим объект, который и будет хранить все данные:
class DataStorage {
Map<String, User> users = new HashMap<>();
public DataStorage AddUser(String login, String password){
users.put(login, new User(login, password));
return this;
}
public User GetUser(String login){
return users.get(login);
}
public boolean HasUser(String login){
return users.containsKey(login);
}
}
В будущем мы так же сможем его расширить добавляя больше различных элементов
Осталось только прикрутить сохранение данных в файл
Первым делом наследуем java.io.Serializable для наших классов:
class User implements java.io.Serializable {}
class DataStorage implements java.io.Serializable {}
Ну и просто делаем 2 метода для сохранения (Гугли "Сериализация java")
class DataStorage implements java.io.Serializable {
// ...
public void SaveTo(String filename){
try
{
FileOutputStream file = new FileOutputStream(filename);
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(this);
out.close();
file.close();
}
catch(IOException ex)
{
System.out.println("IOException");
}
}
public static DataStorage LoadFrom(String filename){
try
{
DataStorage object;
FileInputStream file = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(file);
object = (DataStorage)in.readObject();
in.close();
file.close();
return object;
}
catch(IOException ex)
{
System.out.println("IOException");
}
catch (ClassNotFoundException ex){
System.out.println("ClassNotFoundException");
}
return null;
}
}
Вот простой пример взаимодействия с описанной выше БД:
Его кстати можно потыкать по ссылке (с рабочей БД, после перезапуска данные сохраняются)
public class Main
{
public static DataStorage data;
public static void main(String[] args) {
File f = new File("database.obj");
if(f.exists() && !f.isDirectory()) {
data = DataStorage.LoadFrom("database.obj");
} else {
data = new DataStorage();
}
User currentUser = null;
cycle: while (true){
String command = System.console().readLine();
switch (command) {
case "register":
Register();
break;
case "login":
currentUser = Login();
break;
case "get premission":
System.out.println(currentUser.premission);
break;
case "set admin":
currentUser.premission = Premission.ADMIN;
break;
case "rem admin":
currentUser.premission = Premission.USER;
break;
case "stop":
data.SaveTo("database.obj");
break cycle;
}
}
}
public static User Login(){
System.out.println("Введите логин:");
String login = System.console().readLine();
if (!data.HasUser(login)){
System.out.println("Пользователя с таким логином не существует");
return null;
}
System.out.println("Введите пароль:");
String password = System.console().readLine();
User user = data.GetUser(login);
if (!user.MatchPassword(password)){
System.out.println("Неверный пароль!");
return null;
} else {
System.out.println("Вы успешно вошли");
return user;
}
}
public static void Register(){
System.out.println("Введите логин:");
String login = System.console().readLine();
if (data.HasUser(login)){
System.out.println("Пользователь с таким логином уже существует");
return;
}
System.out.println("Введите пароль:");
String password = System.console().readLine();
data.AddUser(login, password);
System.out.println("Пользователь создан");
return;
}
}