Скрыть определенные кнопки боковой панели на основе ролей пользователей?

#java #spring #spring-boot #spring-security

#java #весна #весенняя загрузка #spring-безопасность

Вопрос:

Мне было интересно, как разрешить разным ролям видеть определенные кнопки боковой панели в зависимости от их роли, используя spring boot 5. У меня есть АДМИНИСТРАТОР и ПОЛЬЗОВАТЕЛЬ, мой администратор должен иметь возможность видеть кнопку «Управление людьми» на боковой панели, в то время как обычный ПОЛЬЗОВАТЕЛЬ ничего не увидит на этой боковой панели.

sideBar.html

     <security:authorize access="hasAuthority('ROLE_ADMIN')">
    <li class="nav-item"><a class="nav-link collapsed"
        href="#" 
            data-toggle="collapse" data-target="#collapseMenu" aria-expanded="true"
            aria-controls="collapseMU"> </i>
                <span> <b>Manage People</b>
            </span>
        </a></li>
        <!-- sub-menu -->
        <div id="collapseMenu" class="collapse">
            <li class="nav-item"><a class="nav-link collapsed" href="#"
                data-toggle="collapse" data-target="#collapseGroup"
                aria-expanded="true" aria-controls="collapseGroup"></i> 
                <span>Show User Group</span>
            </a>
        </div>
     </security:authorize>
 

SecConfig.java (часть этого)

 protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf().and().authorizeRequests().antMatchers("/").permitAll()
        antMatchers("/landing")
        .access("(hasAnyRole('ADMIN')
        .anyRequest()
        .authenticated()
        .and()
        .formLogin()
        .loginPage("/")
        .successHandler(loginSuccessHandler())
        .failureHandler(loginFailedHandler())
        .permitAll().and().logout().permitAll();
}
 

Я попытался добавить
<security:authorize access="hasAuthority('ADMIN')">
в sideBar.html но ПОЛЬЗОВАТЕЛЬСКАЯ страница по-прежнему может видеть кнопку «Управление людьми» на боковой панели.
Есть ли что-то, что я делаю неправильно?
Я новичок в этом. Спасибо: 3

Ответ №1:

Если вы используете движок Thymeleaf, в Spring Security module интегрирован диалект «sec». Вот подробности

По ссылке:

Атрибут sec:authorize отображает его содержимое, когда выражение атрибута оценивается как true:

 <div sec:authorize="isAuthenticated()">
  This content is only shown to authenticated users.
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
  This content is only shown to administrators.
</div>
<div sec:authorize="hasRole('ROLE_USER')">
  This content is only shown to users.
</div>
 

Имейте в виду, что вам нужно будет включить пространство имен безопасности Thymeleaf в корневой тег перед его использованием:

 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
 

Ответ №2:

Атрибут sec:authorize отображает его содержимое, когда выражение атрибута оценивается как true:

     <div sec:authorize="isAuthenticated()"> 

 <!-- The Content under this is visible when the user is login with any ROLE -->
    </div>

    <div sec:authorize="hasRole('ROLE_ADMIN')">

  <!-- The content under this is visible when login user is ADMIN-->

    </div>

    <div sec:authorize="hasRole('ROLE_USER')">

   <!-- The content under this is visible when login user has role 'USER' -->

    </div>
 

Ответ №3:

Обязательно добавьте это в свой тег thymeleaf

 xmlns:security="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
 

Кроме того, добавьте зависимость ниже в свой pom.xml файл:

     <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    </dependency>
 

Ответ №4:

Сначала вы проверяете, аутентифицирован ли пользователь, а затем проверяете, является ли его роль администратором, а затем отображаете содержимое, т.е

 <div sec:authorize="isAuthenticated()"> 
  <div sec:authorize="hasRole('ROLE_ADMIN')">

    <li class="nav-item"><a class="nav-link collapsed"
        href="#" 
            data-toggle="collapse" data-target="#collapseMenu" aria-expanded="true"
            aria-controls="collapseMU"> </i>
                <span> <b>Manage People</b>
            </span>
        </a></li>
        <!-- sub-menu -->
        <div id="collapseMenu" class="collapse">
            <li class="nav-item"><a class="nav-link collapsed" href="#"
                data-toggle="collapse" data-target="#collapseGroup"
                aria-expanded="true" aria-controls="collapseGroup"></i> 
                <span>Show User Group</span>
            </a>
        </div>

    </div>
  
</div>