Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/55: Рейтинг темы: голосов - 55, средняя оценка - 4.89
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841

Добавление юзера и его роли в бд (Spring Security, Hibernate)

23.04.2016, 21:36. Показов 10937. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть следующая структура проекта, основное:
Role.java
Кликните здесь для просмотра всего текста
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
@Entity
@Table(name = "roles")
public class Role {
 
    @Id
    @GeneratedValue
    private Integer id;
 
    private String role;
 
    @OneToMany(cascade= CascadeType.ALL)
    @JoinTable(name="user_roles",
            joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")},
            inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}
    )
    private Set<User> userRoles;
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getRole() {
        return role;
    }
 
    public void setRole(String role) {
        this.role = role;
    }
 
    public Set<User> getUserRoles() {
        return userRoles;
    }
 
    public void setUserRoles(Set<User> userRoles) {
        this.userRoles = userRoles;
    }
 
}

User.java
Кликните здесь для просмотра всего текста
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
@Entity
@Table(name="users")
public class User {
 
    @Id
    @GeneratedValue
    private Integer id;
 
    @Column
    private String login;
 
    @Column
    private String password;
 
    @Column
    private String firstName;
 
    @Column
    private String lastName;
 
    @Column
    private String email;
 
    @Column(name = "date_of_registration")
    private Date dateOfRegistration = setDateByRegistration();
 
    @OneToOne(cascade=CascadeType.ALL)
    @JoinTable(name="user_roles",
            joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
            inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}
    )
    private Role role;
 
    private static Date setDateByRegistration(){
        return new Date();
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public Date getDateOfRegistration() {
        return dateOfRegistration;
    }
 
    public void setDateOfRegistration(Date dateOfRegistration) {
        this.dateOfRegistration = dateOfRegistration;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer 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 Role getRole() {
        return role;
    }
 
    public void setRole(Role role) {
        this.role = role;
    }
 
}

CustomUserDetailsService.java
Кликните здесь для просмотра всего текста
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
@Service
@Transactional(readOnly=true)
public class CustomUserDetailsService implements UserDetailsService {
 
    @Autowired
    private UserDAO userDAO;
 
    public UserDetails loadUserByUsername(String login)
            throws UsernameNotFoundException {
 
        com.sprsec.model.User domainUser = userDAO.getUser(login);
 
        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;
 
        return new User(
                domainUser.getLogin(),
                domainUser.getPassword(),
                enabled,
                accountNonExpired,
                credentialsNonExpired,
                accountNonLocked,
                getAuthorities(domainUser.getRole().getId())
        );
    }
 
    public Collection<? extends GrantedAuthority> getAuthorities(Integer role)
    {
        List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role));
        return authList;
    }
 
    public List<String> getRoles(Integer role) {
 
        List<String> roles = new ArrayList<String>();
 
        if (role.intValue() == 1)
        {
            roles.add("ROLE_ADMIN");
        }
        else if (role.intValue() == 2)
        {
            roles.add("ROLE_MODERATOR");
        }
        else if(role.intValue() == 3)
        {
            roles.add("ROLE_USER");
        }
        return roles;
    }
 
    public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
 
        for (String role : roles) {
            authorities.add(new SimpleGrantedAuthority(role));
        }
        return authorities;
    }
 
}

spring-security.xml
Кликните здесь для просмотра всего текста
XML
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
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
    [url]http://www.springframework.org/schema/beans/spring-beans-4.1.xsd[/url]
    [url]http://www.springframework.org/schema/security[/url]
    http://www.springframework.org/schema/security/spring-security-3.2.xsd">
 
    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>
       <http auto-config="true" use-expressions="true">
 
              <intercept-url pattern="/sec/moderation.html" access="hasRole('ROLE_MODERATOR')" />
              <intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />
 
              <form-login login-page="/user-login.html"
                          default-target-url="/success-login.html"
                          authentication-failure-url="/error-login.html" />
              <logout logout-success-url="/index.html" />
 
       </http>
 
       <authentication-manager>
              <authentication-provider user-service-ref="customUserDetailsService">
                     <password-encoder hash="plaintext" />
              </authentication-provider>
       </authentication-manager>
 
</beans:beans>

Такой вопрос, как мне при добавлении юзера добавлять автоматически его роль в таблицу user_roles?
Я пробовал как-то так,
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@OneToOne(cascade=CascadeType.ALL)
    @JoinTable(name="user_roles",
            joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},
            inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}
    )
    private Role role = setDefRole();
 
    private static Role setDefRole()
    {
        Role role = new Role();
        role.setRole("ROLE_USER");
        return role;
    }
но так добавляеться и сама роль в таблицу role, чего не должно быть.
Таблицы:
Миниатюры
Добавление юзера и его роли в бд (Spring Security, Hibernate)  
Изображения
  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2016, 21:36
Ответы с готовыми решениями:

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

Добавление в проект spring security
Как настроить конфиг для спринг сикьюрити и связать с энтити ?(так понял связка идет через все слои:конфиг контроллер сервис репозиторий...

IBExpert - где устанавливать юзерам роли? Не могу задать роли юзера БД
Здраствуйте, подскажите как назначить роли ползователям БД? В IBexpert захожу в Менеджер прав, а дальше что делать не знаю... Версия...

9
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
24.04.2016, 11:40
Что то у вас запутанный маппинг таблиц.
Цитата Сообщение от asics Посмотреть сообщение
private Set<User> userRoles;
Зачем в сущности ролей список юзеров у которых есть эта роль? Это избыточность.

У вас отношения многие-ко-многим между юзерами и ролями?
Цитата Сообщение от asics Посмотреть сообщение
Такой вопрос, как мне при добавлении юзера добавлять автоматически его роль в таблицу user_roles?
Я пробовал как-то так,
Вы имеете в виду добавление нового юзера в бд?
Где код, который фактически вносит юзера в базу?
0
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
25.04.2016, 18:44
Цитата Сообщение от asics Посмотреть сообщение
Такой вопрос, как мне при добавлении юзера добавлять автоматически его роль в таблицу user_roles?
не совсем понятный вопрос как система определяет автоматически к какому ролью относится новый пользователь?
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.04.2016, 19:44  [ТС]
Цитата Сообщение от asus Посмотреть сообщение
не совсем понятный вопрос как система определяет автоматически к какому ролью относится новый пользователь?
Ну очевидно же, что если юзер регистрируеться предложеной формой регистрации, то роль у него будет ROLE_USER.
0
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
26.04.2016, 19:50
asics, а почему юзеры с ролями связаны много к многим?
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.04.2016, 20:03  [ТС]
asus, наверное, что бы, к примеру, юзер мог быть и админом и модер, как-то так.
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
26.04.2016, 21:03
Когда пишете нового юзера в базу, делайте insert с ролью юзера.
Можно и через триггер на стороне бд это сделать.
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.04.2016, 21:13  [ТС]
Любопытный, а есть вообше смысл держать роли в базе? я просто переделал без этих таблиц, а добавил enum ролей
0
89 / 89 / 20
Регистрация: 19.02.2010
Сообщений: 966
27.04.2016, 03:53
Цитата Сообщение от asics Посмотреть сообщение
asus, наверное, что бы, к примеру, юзер мог быть и админом и модер, как-то так.
тогда получается админ прописывает роль юзеру? т.к. при регистрации система не может же определить автоматически, а вообще можете тупо прописать типа при регистрации нового пользователя система присваивает ему id_basic_role.
Цитата Сообщение от asics Посмотреть сообщение
а есть вообше смысл держать роли в базе? я просто переделал без этих таблиц, а добавил enum ролей
думаю да
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
27.04.2016, 08:05
Цитата Сообщение от asics Посмотреть сообщение
я просто переделал без этих таблиц, а добавил enum ролей
Зачем? Не вижу от такого подхода особых преимуществ.

Добавлено через 3 минуты
Если Вы рассуждаете с точки зрения уменьшения нагрузки на базу(уменьшение количества запросов), то у хибернейта гибкая система кеширования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2016, 08:05
Помогаю со студенческими работами здесь

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...

Security и роли
MS SQL 2000, Windows 2000 раньше все было ок - стирал/редактировал/добавлял записи во все таблицы, создавал новые. ...

Spring. Тесты и Spring-security
Вопрос из области почему так. Есть у меня такой вот тест: @ContextConfiguration(locations =...

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

Spring security c 3 на 4
Не знаю почему, но после того, как перешел на spring security 4 возникает проблема. Захожу на страницу логина, ввожу имя и пароль....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru