Безопасность Spring: несколько ролей для одного пользователя - PullRequest
2 голосов
/ 11 апреля 2011

Мое приложение требует, чтобы я определил несколько ролей для одного пользователя.

Я прочитал Безопасность Spring с базой данных и несколькими ролями? .

Почему мы должны реализовывать наши собственные UserDetails?Существующий содержит

Collection getAuthorities();

Также есть какие-либо ссылки или руководства, которые я могу использовать для реализации нескольких ролей для одного пользователя?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

Принятый ответ на сообщение, на которое вы ссылались, мне не кажется правильным. Для этого вам не нужно создавать собственную реализацию UserDetailsService. Несколько ролей уже поддерживаются. См. JdbcDaoImpl . Вы просто должны убедиться, что authoritiesByUsernameQuery соответствует вашей базе данных. По умолчанию его значение равно select username,authority from authorities where username = ?. Этот запрос выполняется методом loadUserAuthorities, который загружает все права доступа.

0 голосов
/ 02 января 2019

Spring Security поддерживает более чем одну роль "из коробки" *

Итак, чтобы сэкономить всем вам много времени:

Необходимо вставить несколько записей для одного и того же пользователя: enter image description here Это было в MySQL Workbench, с MySQL 5.7.24. Также в других средах - на случай, если вам интересно, какую версию воспроизводитьэтот результат:

    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- optional, it brings useful tags to display spring security stuff -->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>

Затем, чтобы проверить, что я создал эту страницу и: enter image description here

Вот пример кода для отображения и проверки прав доступа вошедшего в учетную запись:

<div data-layout-fragment="content" class="content">
    <div class="row mt-4">
    <div class="col-md-12">
        <h2>Show Authorities Glance</h2>
        <div class="card">
        <div class="card-body">
            Logged user: <span data-sec-authentication="name">Bob</span>
            Roles: <span data-sec-authentication="principal.authorities">[ROLE_USER, ROLE_ADMIN]</span>
            <div data-sec-authorize="isAuthenticated()">
            This content is only shown to authenticated users.
            </div>
            <div data-sec-authorize="hasRole('ROLE_USER')">
            This content is only shown to ROLE_USER.
            </div>
            <div data-sec-authorize="hasRole('ROLE_EMPLOYEE')">
            This content is only shown to ROLE_EMPLOYEE.
            </div>
            <div data-sec-authorize="hasRole('ROLE_FOUNDER')">
            This content is only shown to ROLE_FOUNDER.
            </div>
            <div data-sec-authorize="hasRole('ROLE_ADMIN')">
            This content is only shown to ROLE_ADMIN.
            </div>
        </div>
        </div>
    </div>
    </div>
</div>
<!--<p>-->
    <!--<a data-th-href="@{/add-authority}">Add a new authority</a>-->
<!--</p>-->
</div>

Да, и это последнее представление содержит тимелист, причем не только стандартный, но и диалект макета.На всякий случай, если вы хотите попробовать это, также нужна эта зависимость:

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

Или получите фрагмент тега макета:

data-layout-fragment="content"
0 голосов
/ 10 июня 2013

В случае, если кто-то заинтересован в пользовательском UserDetailsService для полномочий, разделенных запятыми:

@Component
public class MyUserDetailsService implements UserDetailsService {

    @Resource
    private AccountService accounts;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        Account account = accounts.findByUsername(username);
        if(null == account) {
            throw new UsernameNotFoundException("User " + username + " not found.");
        }

        List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
        String[] authStrings = account.getAuthorities().split(", ");
        for(String authString : authStrings) {
            authorities.add(new SimpleGrantedAuthority(authString));
        }

        UserDetails ud = new User(account.getUsername(), account.getPassword(), authorities);
        return ud;
    }

}

Теперь у вас может быть что-то подобное в БД:

+----+-----------------------+----------+----------+
| id | authorities           | password | username |
+----+-----------------------+----------+----------+
|  1 | ROLE_ADMIN            | 123qwe   | markm    |
|  2 | ROLE_ADMIN, ROLE_USER | 123qwe   | kemika   |
+----+-----------------------+----------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...