Помогите написать систему ролей без использования 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;
    }
}
→ Ссылка