Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 15.10.2019
Сообщений: 67

Паттерн DAO и роли пользователей

23.11.2020, 16:39. Показов 3919. Ответов 3

Студворк — интернет-сервис помощи студентам
Есть два класса в проекте: User и Role. Для того, чтобы связать пользователей и их роли, нужно в класс User добавить Set ролей. А как тогда в методах (GRUD-операциях, в сервлетах, например) обращаться конкретно к id роли или названию роли? Или как, например, в методе findAll() добавлять ещё и роль пользователю (опять же, используя этот Set<Role> roles)?

Класс User:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package domain;
 
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
 
public class User {
    private int id;
    private String login;
    private String password;
    private String name;
    private int age;
    private Set<Role> roles;
 
    public User() {
 
    }
 
    public User(int idUser, String login, String password, String name, int age) {
    }
 
    public User(String loginUser, String passwordUser) {
        this.login = loginUser;
        this.password = passwordUser;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getLogin() {
        return login;
    }
 
    public void setLogin(String login) {
        this.login = login;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public Set<Role> getRoles() {
        return roles;
    }
 
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", login='" + login + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", roles=" + roles +
                '}';
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                age == user.age &&
                login.equals(user.login) &&
                password.equals(user.password) &&
                name.equals(user.name) &&
                roles.equals(user.roles);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(id, login, password, name, age, roles);
    }
 
}

Класс Role:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package domain;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
 
public class Role {
    private int idRole;
    private String nameOfRole;
 
    public Role() {
    }
 
    public Role(int idRole, String nameOfRole) {
        this.idRole = idRole;
        this.nameOfRole = nameOfRole;
    }
 
    public Role(String nameOfRole) {
    }
 
    public Role(int idRole) {
    }
 
    public int getIdRole() {
        return idRole;
    }
 
    public void setIdRole(int idRole) {
        this.idRole = idRole;
    }
 
    public String getNameOfRole() {
        return nameOfRole;
    }
 
    public void setNameOfRole(String nameOfRole) {
        this.nameOfRole = nameOfRole;
    }
 
 
    @Override
    public String toString() {
        return "Role{" +
                "idRole=" + idRole +
                ", nameOfRole='" + nameOfRole + '\'' +
                '}';
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Role role = (Role) o;
        return idRole == role.idRole &&
                nameOfRole.equals(role.nameOfRole);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(idRole, nameOfRole);
    }
}
Работа с БД для User:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package dao;
 
import dao.config.ConnectionDB;
import domain.Role;
import domain.User;
import java.sql.*;
import java.util.LinkedHashSet;
import java.util.Set;
 
public class UserDaoImpl implements UserDao {
 
    @Override
    public Set<User> findAll() {
        Set<User> users = new LinkedHashSet<>();
        String sqlSelect = "SELECT users.id, users.login, users.password, users.name, users.age, roles.\"idRole\", roles.name_of_role FROM users LEFT JOIN users_roles ON users_roles.usersid = users.id LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" ORDER BY id ASC";
        try (Connection conn = ConnectionDB.getNewConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sqlSelect)) {
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setLogin(resultSet.getString("login"));
                user.setPassword(resultSet.getString("password"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
 
                users.add(user);
            }
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return users;
    }
 
    @Override
    public User findById(int id, int idRole) {
        User user = null;
        String sqlId = "SELECT users.id, users.login, users.password, users.name, users.age, roles.\"idRole\" FROM users LEFT JOIN users_roles ON users_roles.usersid = users.id LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" WHERE users_roles.usersid = ? AND  users_roles.rolesid = ? ";
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlId)) {
                preparedStatement.setInt(1, id);
                preparedStatement.setInt(2, idRole);
                ResultSet resultSet = preparedStatement.executeQuery();
                if (resultSet.next()) {
                    int idUser = resultSet.getInt("id");
                    String login = resultSet.getString("login");
                    String password = resultSet.getString("password");
                    String name = resultSet.getString("name");
                    int age = resultSet.getInt("age");
                    int idUserRole = resultSet.getInt("idRole");
                    user = new User(idUser, login, password, name, age);
                }
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return user;
    }
 
 
    @Override
    public User selectUserByLogin(String login, String password) {
        User user = null;
        String sqlId = "SELECT users.login, users.password, roles.\"idRole\", roles.name_of_role\n" +
                "FROM users \n" +
                "LEFT JOIN users_roles ON users_roles.usersid = users.id \n" +
                "LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" \n" +
                "WHERE users.login = ? AND  users.password = ? ";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlId)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                ResultSet resultSet = preparedStatement.executeQuery();
                if (resultSet.next()) {
                    String loginUser = resultSet.getString("login");
                    String passwordUser = resultSet.getString("password");
                    String roleUser = resultSet.getString("name_of_role");
                    user = new User(loginUser, passwordUser, roleUser);
                }
            }
 
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return user;
    }
 
    @Override
    public int createUser(String login, String password, String name, int age, int rolesid) {
        String sqlInsert = "with insert_user as (INSERT INTO users (login, password, name, age)\n" +
                "VALUES (?, ?, ?, ?)\n" +
                "returning id\n" +
                ")\n" +
                "INSERT INTO users_roles (usersid, rolesid) SELECT insert_user.id, (?) from insert_user";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
 
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlInsert)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                preparedStatement.setString(3, name);
                preparedStatement.setInt(4, age);
                preparedStatement.setInt(5, rolesid);
 
                return preparedStatement.executeUpdate();
            }
 
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return 0;
    }
 
 
    @Override
    public int editUser(int id, String login, String password, String name, int age, int rolesid) {
        String sqlUpdate = "with edit_user as (\n" +
                "  update users\n" +
                "  SET login = ?, password = ?, name = ?, age = ?\n" +
                "  WHERE id = ?\n" +
                "  returning *\n" +
                ")\n" +
                "update users_roles\n" +
                "set rolesid = ?\n" +
                "where usersid = ?";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlUpdate)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                preparedStatement.setString(3, name);
                preparedStatement.setInt(4, age);
                preparedStatement.setInt(5, id);
                preparedStatement.setInt(6, rolesid);
                preparedStatement.setInt(7, id);
                return preparedStatement.executeUpdate();
            }
 
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return 0;
    }
 
    @Override
    public int delete(int id) {
        String sqlDelete = "DELETE FROM users WHERE id = ?";
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlDelete)) {
                preparedStatement.setInt(1, id);
                return preparedStatement.executeUpdate();
            }
 
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return 0;
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2020, 16:39
Ответы с готовыми решениями:

Роли пользователей в Spring
Пытаюсь реализовать примитивную авторизацию/регистрацию с бд через SpringSecurity. Вопрос касательно этого блока: @Override ...

Spring Security и роли пользователей
В проекте на Spring MVC + ExtJS + Spring Security имеется такая конфигурация в файле applicationContext-security.xml &lt;?xml...

Описание DAO паттерн на русском. Где найти?
Кто-нибудь подскажет где можно найти информацию (описание)про DAO (Data Access Object) паттерн проектирования НА РУССКОМ? Нашел только...

3
2 / 3 / 0
Регистрация: 16.02.2017
Сообщений: 36
24.11.2020, 13:29
А в чем собственно проблема?
У тебя есть класс User. Создаешь объект:
Java
1
User newUser = new User(idUser, login, password, name, age)
Из запроса ты так же достаешь роль. Создай так же объект для нее:

Java
1
Role roleUser = new Role( idRole, nameOfRole)
И установи этот объект роли к юзеру:

Java
1
newUser.SetRole(roleUser);
И соответственно измени тип реквизита класса юзера
Java
1
private Role role;
Только хорошо бы было сделать проверку на наличие уже созданного объекта роли и пользователя
1
1 / 1 / 0
Регистрация: 15.10.2019
Сообщений: 67
24.11.2020, 16:03  [ТС]
CarpeDiem62, Тогда здесь не будет связи многие-ко-многим, а мне нужно именно в такой конструкции. Поэтому, и должен быть использован Set<Role> roles. Чтобы, по возможности, мы могли добавить несколько ролей одному пользователю
0
2 / 3 / 0
Регистрация: 16.02.2017
Сообщений: 36
24.11.2020, 17:08
Значит у тебя три таблицы.
Не знаю, может знатоки предложат что-то получше.

1. Делаешь запрос к пользователям, создаешь объекты, выгружаешь в массив (как ты это и делал)
Java
1
 users.add(user);
2. Делаешь запрос к таблице связей пользователей и их ролей:
SQL
1
2
SELECT ТаблицаСвязей.ИдПользователя, ТаблицаРолей.ИдРоли, ТаблицаРолей.НазваниеРоли
FROM ТаблицаСвязей  LEFT JOIN ТаблицаРолей ON ТаблицаСвязей.ИдРоли = ТаблицаРолей.ИдРоли
В итоге у тебя список из ИдПользователя, ИдРоли и ее названия.
Дальше создаешь роли с проверкой на уже существование. И по ИД пользователя привязываешь эту роль ему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2020, 17:08
Помогаю со студенческими работами здесь

Как вывести всех пользователей, привязанных к роли, кроме текущего (того, кто тоже в этой роли)?
Есть роль User (identity).Текущий пользователь заходит в приложение и видит список всех пользователей в роли User, выведенных на экран,...

Роли пользователей
Есть две роли пользователей. Первая роль: имеет возможность только просматривать таблицу, после назначение. Вторая роль: создаёт...

Роли пользователей и их возможности
Всем доброго времени суток. Такой вопрос. При добавлении новой роли пользователя, нам нужно указать такой параметр как capabilities. ...

Роли в Acl и группы пользователей
Подскажите, пожалуйста, как решить следующую задачу. Есть база на сервере. В ACL этой базы определены роли. Как определить в LS,...

Роли, права, классы пользователей
Всем доброго времени суток. Меня интересует, есть ли какая нибудь система управление пользователями и правами их доступа? Раньше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru